#include //#include using namespace std; //using namespace atcoder; using ll = long long; using vc = vector; using vvc = vector>; using u64 = uint64_t; using pqi = priority_queue; using dqi = deque; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define llrep(i, n) for (LL i = 0; i < (int)(n); i++) #define nrep(i, s, n) for (int i = s; i < n; i++) #define drep(i, n) for (int i = (n) - 1; i >= 0; i--;) #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define pb push_back #define mp make_pair #define int long long const int INF = 1e17; const double pi = 3.14159265358979; const int mod = 998244353; const int MOD = 1000000007; //sni:tmp,pi,vvc,no,NO,yes,YES,vi,keta,pq,g signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin>>n>>m; vector> path(n); vector deg(n, 0); rep(i, m) { int u, v; cin >> u >> v; u--; v--; path[u].pb(v); path[v].pb(u); deg[u]++; deg[v]++; } vector rem; vector removed(n, false); queue q; rep(i, n) { if (deg[i] == 3) q.push(i); } int nokori = n; while (nokori > 3 && !q.empty()) { int u = q.front(); q.pop(); if (removed[u] || deg[u] != 3) continue; removed[u] = true; rem.push_back(u); nokori--; for (int v : path[u]) { if (!removed[v]) { deg[v]--; if (deg[v] == 3) q.push(v); } } } vector ans(n,0); int c = 1; rep(i, n) { if (!removed[i]) { ans[i] = c++; } } reverse(rem.begin(), rem.end()); for (int u : rem) { vector used(5, false); for (int v : path[u]) { if (ans[v] != 0) { used[ans[v]] = true; } } nrep(i,1,4) if (!used[i]) { ans[u] = i; break; } } cout << "Yes" << endl; rep(i,n) { cout << ans[i]+1 << " "; } cout << endl; }