#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> G[100000];
vector<int> l2;
int C[100000], A[100000], D[100000];
vector<int> E[100000];
int cnt[3];
void dfs(int v, int c) {
  C[v] = c;
  ++cnt[c];
  for (int j = 0; j < (int)G[v].size(); j++) {
    int w = G[v][j];
    if (!C[w])
      dfs(w, 3 - c);
    else
      assert(C[w] == 3 - c);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    --x, --y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  for (int i = 0; i < n; i++)
    if (!C[i]) dfs(i, 1);
  if (cnt[1] % 3 == 2) {
    int t = cnt[1];
    cnt[1] = cnt[2];
    cnt[2] = t;
    for (int i = 0; i < n; i++) C[i] = 3 - C[i];
  }
  int beg = 1;
  if (cnt[1] % 3 == 1) {
    for (int i = 0; i < n; i++)
      if (C[i] == 2) l2.push_back(i);
    int f = -1;
    for (int i = 0; i < n; i++)
      if (C[i] == 1) {
        if ((int)G[i].size() < cnt[2] - 1) {
          f = i;
          break;
        }
        if ((int)G[i].size() == cnt[2] - 1) {
          for (int j = 0; j < (int)G[i].size(); j++) ++D[G[i][j]];
          int q = -1;
          for (int j = 0; j < (int)l2.size(); j++)
            if (!D[l2[j]]) {
              q = l2[j];
              break;
            }
          assert(q >= 0);
          for (int j = 0; j < (int)G[i].size(); j++) --D[G[i][j]];
          E[q].push_back(i);
        }
      }
    if (f >= 0) {
      for (int j = 0; j < (int)G[f].size(); j++) ++D[G[f][j]];
      int q = 0;
      for (int j = 0; j < (int)l2.size(); j++)
        if (!D[l2[j]]) {
          C[l2[j]] = 0;
          A[l2[j]] = 1;
          ++q;
          if (q >= 2) break;
        }
      C[f] = 0;
      A[f] = 1;
      ++beg;
    } else {
      for (int j = 0; j < (int)l2.size(); j++)
        if (E[l2[j]].size() >= 2) {
          C[E[l2[j]][0]] = 0;
          C[E[l2[j]][1]] = 0;
          C[l2[j]] = 0;
          A[E[l2[j]][0]] = beg;
          A[E[l2[j]][1]] = beg;
          A[l2[j]] = beg;
          ++beg;
          if (beg == 3) break;
        }
      if (beg < 3) {
        puts("NO");
        return 0;
      }
    }
  }
  int m = 0;
  for (int i = 0; i < n; i++)
    if (C[i] == 1) {
      A[i] = beg;
      ++m;
      if (m == 3) {
        m = 0;
        ++beg;
      }
    }
  assert(!m);
  for (int i = 0; i < n; i++)
    if (C[i] == 2) {
      A[i] = beg;
      ++m;
      if (m == 3) {
        m = 0;
        ++beg;
      }
    }
  assert(!m);
  puts("YES");
  for (int i = 0; i < n; i++) printf("%d%c", A[i], " \n"[i == n - 1]);
  return 0;
}
