#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;
}
