#include <bits/stdc++.h>
using namespace std;
int u[100100], h[100100], g[100100], a[100100];
vector<int> v[2], m[100100];
void dfs(int i, int f) {
  int j;
  u[i] = 1;
  v[f].push_back(i);
  for (j = 0; j < m[i].size(); j++)
    if (!u[m[i][j]]) dfs(m[i][j], f ^ 1);
}
int main() {
  int i, j, k, n, f, c, ii;
  for (scanf("%d%d", &n, &k); k--; scanf("%d%d", &i, &j), i--, j--,
                                   m[i].push_back(j), m[j].push_back(i), h[i]++,
                                   h[j]++)
    ;
  for (i = 0; i < n; i++)
    if (!u[i]) dfs(i, 0);
  c = 0;
  if (v[0].size() % 3) {
    if (v[0].size() % 3 == 1)
      f = 0;
    else
      f = 1;
    for (i = 0; i < v[f].size() && h[v[f][i]] + 2 > v[f ^ 1].size(); i++)
      ;
    if (i < v[f].size()) {
      i = v[f][i];
      a[c++] = i;
      for (j = 0; j < v[f ^ 1].size(); g[v[f ^ 1][j]] = 1, j++)
        ;
      for (j = 0; j < m[i].size(); g[m[i][j]] = 0, j++)
        ;
      for (j = 0; j < n && !g[j]; j++)
        ;
      a[c++] = j;
      for (j++; j < n && !g[j]; j++)
        ;
      a[c++] = j;
      for (j++; j < n; g[j] = 0, j++)
        ;
      g[i] = 1;
    } else {
      f ^= 1;
      for (i = 0; i < v[f].size() && h[v[f][i]] + 2 > v[f ^ 1].size(); i++)
        ;
      if (i >= v[f].size()) {
        printf("NO\n");
        return 0;
      }
      ii = i + 1;
      i = v[f][i];
      a[c++] = i;
      for (j = 0; j < v[f ^ 1].size(); g[v[f ^ 1][j]] = 1, j++)
        ;
      for (j = 0; j < m[i].size(); g[m[i][j]] = 0, j++)
        ;
      for (j = 0; j < n && !g[j]; j++)
        ;
      a[c++] = j;
      for (j++; j < n && !g[j]; j++)
        ;
      a[c++] = j;
      for (j++; j < n; g[j] = 0, j++)
        ;
      g[i] = 1;
      for (i = ii; i < v[f].size() && h[v[f][i]] + 2 > v[f ^ 1].size(); i++)
        ;
      if (i >= v[f].size()) {
        printf("NO\n");
        return 0;
      }
      i = v[f][i];
      a[c++] = i;
      for (j = 0; j < v[f ^ 1].size(); j++)
        if (!g[v[f ^ 1][j]]) g[v[f ^ 1][j]] = 2;
      for (j = 0; j < m[i].size(); j++)
        if (g[m[i][j]] == 2) g[m[i][j]] = 0;
      for (j = 0; j < n && g[j] != 2; j++)
        ;
      a[c++] = j;
      for (j++; j < n && g[j] != 2; j++)
        ;
      a[c++] = j;
      for (j++; j < n; j++)
        if (g[j] == 2) g[j] = 0;
      g[i] = 1;
    }
  }
  for (f = 0; f < 2; f++)
    for (i = 0; i < v[f].size(); i++)
      if (!g[v[f][i]]) a[c++] = v[f][i];
  for (i = 0; i < n; u[a[i]] = i / 3, i++)
    ;
  for (printf("YES\n"), i = 0; i < n;
       printf("%d%c", u[i] + 1, i < n - 1 ? ' ' : '\n'), i++)
    ;
  return 0;
}
