func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = (int)1e5;   int ans[N], all, u, v, n, m, num, color[N], cnt[2];   vector<int> adj[N], radj[N];   bool used[N];   void output() {     printf( YES n );     for (int i = 0; i < n; ++i) printf( %d%c , ans[i] + 1,    n [i == n - 1]);     exit(0);   }   void dfs(int v, int c) {     color[v] = c, cnt[c]++;     for (int j = 0; j < ((int)(adj[v]).size()); ++j)       if (color[adj[v][j]] == -1) dfs(adj[v][j], c ^ 1);   }   void truecolor() {     int deg = 0;     for (int t = 0; t < 2; ++t) {       for (int i = 0; i < n; ++i)         if (color[i] == t) {           ans[i] = num;           ++deg;           if (deg == 3) {             ++num;             deg = 0;           }         }     }   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 0; i < m; ++i)       scanf( %d%d , &u, &v), --u, --v, adj[u].push_back(v), adj[v].push_back(u);     memset(color, -1, sizeof(color));     for (int i = 0; i < n; ++i)       if (color[i] == -1) dfs(i, 0);     if (cnt[0] % 3 > cnt[1] % 3) {       for (int i = 0; i < n; ++i) color[i] ^= 1;       swap(cnt[0], cnt[1]);     }     all = 0;     for (int i = 0; i < n; ++i)       if (color[i] == 1) all ^= i;     num = 0;     if (cnt[0] % 3 == 0) {       truecolor();       output();     }     for (int i = 0; i < n; ++i)       if (color[i] == 0)         if (((int)(adj[i]).size()) <= cnt[1] - 2) {           ans[i] = 0, color[i] = 2;           for (int j = 0; j < ((int)(adj[i]).size()); ++j) used[adj[i][j]] = true;           int deg = 2;           for (int j = 0; deg && (j < n); ++j)             if ((color[j] == 1) && !used[j]) {               color[j] = 2;               ans[j] = 0;               --deg;             }           ++num;           truecolor();           output();         } else if (((int)(adj[i]).size()) == cnt[1] - 1) {           int x = all;           for (int j = 0; j < ((int)(adj[i]).size()); ++j) x ^= adj[i][j];           radj[x].push_back(i);         }     int res = 0;     for (int i = 0; i < n; ++i)       if (((int)(radj[i]).size()) >= 2) res++;     if (res <= 1) {       printf( NO n );       return 0;     }     res = 2;     for (int i = 0; res && (i < n); ++i)       if (((int)(radj[i]).size()) >= 2) {         ans[i] = num, color[i] = 2;         for (int j = 0; j < 2; ++j) ans[radj[i][j]] = num, color[radj[i][j]] = 2;         --res;         ++num;       }     truecolor();     output();     return 0;   }   