#include #include using namespace std; using i32 = int; using i64 = long long; using i128 = __int128_t; using f64 = double; using p2 = pair; using p3 = tuple; using mint = atcoder::modint998244353; constexpr i64 inf = 1e18; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } void _main() { i64 n, m; cin >> n >> m; vector one(n, false); vector edge(m); vector> g(n); for (i64 i = 0; i < m; i++) { i64 u, v; cin >> u >> v; u--, v--; if (u > v) swap(u, v); g[u].push_back(v); g[v].push_back(u); if (u == 0) one[v] = true; edge[i] = {u, v}; } vector ans(n, -1); vector> adj(n); vector stack; for (auto [u, v] : edge) { if (!one[u] || !one[v]) continue; adj[0] = {1, 2, 3}; adj[u] = {0, 2, 3}; adj[v] = {0, 1, 3}; ans[0] = 0, ans[u] = 1, ans[v] = 2; stack = {0, u, v}; break; } while (!stack.empty()) { i64 i = stack.back(); stack.pop_back(); for (i64 ni : g[i]) { if (ans[ni] != -1) { assert(ans[i] != ans[ni]); continue; } adj[ni].insert(ans[i]); if (adj[ni].size() >= 3) { assert(adj[ni].size() == 3); for (i64 k = 0; k < 4; k++) { if (!adj[ni].count(k)) { ans[ni] = k; } } stack.push_back(ni); } } } cout << "Yes\n"; for (i64 i = 0; i < n; i++) { cout << ans[i] + 1 << " "; } cout << "\n"; }