#include using namespace std; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; #define rep(i, n) for (int i = 0; i < n; i++) #define all(x) x.begin(), x.end() constexpr ll dx[] = {1, 0, -1, 0, 1, -1, -1, 1}; constexpr ll dy[] = {0, 1, 0, -1, 1, 1, -1, -1}; struct Init { Init() { ios::sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(15); } } init; template ostream& operator<<(ostream& os, const pair& pair_var) { os << pair_var.first << " " << pair_var.second; return os; } template ostream& operator<<(ostream& os, const vector& vec) { rep(i, vec.size()) { os << vec[i]; if (i != vec.size() - 1) os << " "; } return os; } template ostream& operator<<(ostream& os, const vector>& vec) { rep(i, vec.size()) { os << vec[i]; if (i != vec.size() - 1) os << " "; } return os; } int main() { ll n, m; cin >> n >> m; vector deg(n); vector> g(n); vector> g2(n); rep(i, m) { int u, v; cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); g2[u].insert(v); g2[v].insert(u); deg[u]++, deg[v]++; } queue que; rep(i, n) { if (deg[i] == 3) { que.push(i); } } vector> vs(n); deque res; vector isDeleted(n); int cnt = n; while (true) { auto x = que.front(); que.pop(); res.push_back(x); for (auto u : g[x]) { vs[x].push_back(u); } for (auto u : g[x]) { if (!isDeleted[u]) { deg[u]--; g2[x].erase(u); g2[u].erase(x); if (deg[u] == 3) { que.push(u); } } } deg[x] = 0; g2[x].clear(); isDeleted[x] = true; cnt--; if (cnt == 3) break; } vector ans(n, -1); cout << "Yes" << endl; ll k = 1; rep(i, n) { if (isDeleted[i] == 0) { ans[i] = k; k++; } } while (!res.empty()) { auto x = res.front(); res.pop_front(); set st = {1, 2, 3, 4}; if (ans[x] == -1) { for (auto k : vs[x]) { st.erase(ans[k]); } ans[x] = *st.begin(); } } cout << ans << endl; return 0; }