#include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, need1, need2, need3; cin >> n >> m >> need1 >> need2 >> need3; vector> g(n); while (m--) { int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); } vector color(n, -1), component(n, -1); vector> side0, side1; for (int start = 0; start < n; ++start) if (color[start] == -1) { int id = side0.size(); side0.push_back({}); side1.push_back({}); queue q; q.push(start); color[start] = 0; component[start] = id; while (!q.empty()) { int u = q.front(); q.pop(); (color[u] == 0 ? side0[id] : side1[id]).push_back(u); for (int v : g[u]) { if (color[v] == -1) color[v] = color[u] ^ 1, component[v] = id, q.push(v); else if (color[v] == color[u]) { cout << "NO\n"; return 0; } } } } int count = side0.size(); vector> choice(count + 1, vector(need2 + 1, -1)); choice[0][0] = 0; for (int i = 0; i < count; ++i) for (int sum = 0; sum <= need2; ++sum) if (choice[i][sum] != -1) { if (sum + static_cast(side0[i].size()) <= need2) choice[i + 1][sum + side0[i].size()] = 0; if (sum + static_cast(side1[i].size()) <= need2) choice[i + 1][sum + side1[i].size()] = 1; } if (choice[count][need2] == -1) { cout << "NO\n"; return 0; } vector selected(count); int sum = need2; for (int i = count; i > 0; --i) { selected[i - 1] = choice[i][sum]; sum -= selected[i - 1] == 0 ? side0[i - 1].size() : side1[i - 1].size(); } vector answer(n, '3'); for (int i = 0; i < count; ++i) { const vector &middle = selected[i] == 0 ? side0[i] : side1[i]; for (int v : middle) answer[v] = '2'; } for (int v = 0; v < n && need1 > 0; ++v) if (answer[v] != '2') answer[v] = '1', --need1; cout << "YES\n"; for (char c : answer) cout << c; cout << '\n'; }