#include <bits/stdc++.h>
using namespace std;
vector<int> mc[2];
vector<int> marks;
vector<vector<int> > vv;
void dfs(int v, int m) {
  if (marks[v] != 0) return;
  marks[v] = m;
  mc[m - 1].push_back(v);
  for (int i = 0; i < vv[v].size(); ++i) dfs(vv[v][i], 3 - m);
}
int main() {
  int n, m;
  cin >> n >> m;
  vv.resize(n);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    vv[a].push_back(b);
    vv[b].push_back(a);
  }
  marks.resize(n);
  for (int i = 0; i < n; ++i) {
    if (!marks[i]) dfs(i, 1);
  }
  if (mc[0].size() % 3 == 2) {
    vector<int> t = mc[0];
    mc[0] = mc[1];
    mc[1] = t;
  }
  for (int i = 0; i < n; ++i) marks[i] = 0;
  int tt = 1;
  int ttt = 0;
  vector<int> marks2(n);
  if (mc[0].size() % 3 != 0) {
    int t1 = -1;
    for (int i = 0; i < mc[0].size(); ++i)
      if (vv[mc[0][i]].size() < mc[1].size() - 1) {
        t1 = mc[0][i];
        break;
      }
    if (t1 != -1) {
      for (int i = 0; i < vv[t1].size(); ++i) marks2[vv[t1][i]] = 1;
      tt = 2;
      marks[t1] = 1;
      int tr = 0;
      for (int i = 0; i < mc[1].size(); ++i)
        if (marks2[mc[1][i]] == 0) {
          marks[mc[1][i]] = 1;
          tr++;
          if (tr == 2) break;
        }
    } else {
      int t2 = -1;
      for (int i = 0; i < mc[1].size(); ++i)
        if (vv[mc[1][i]].size() < mc[0].size() - 1) {
          if (t1 == -1)
            t1 = mc[1][i];
          else {
            t2 = mc[1][i];
            break;
          }
        }
      if (t2 == -1) {
        cout << "NO" << endl;
        return 0;
      }
      tt = 3;
      marks[t1] = 1;
      marks[t2] = 2;
      for (int i = 0; i < vv[t1].size(); ++i) marks2[vv[t1][i]] = 1;
      int tr = 0;
      for (int i = 0; i < mc[0].size(); ++i)
        if (marks2[mc[0][i]] == 0) {
          marks[mc[0][i]] = 1;
          tr++;
          if (tr == 2) break;
        }
      tr = 0;
      for (int i = 0; i < vv[t2].size(); ++i) marks2[vv[t2][i]] = 2;
      for (int i = 0; i < mc[0].size(); ++i)
        if (marks2[mc[0][i]] != 2) {
          marks[mc[0][i]] = 2;
          tr++;
          if (tr == 2) break;
        }
    }
  }
  for (int cc = 0; cc <= 1; ++cc) {
    for (int zz = 0; zz < mc[cc].size(); ++zz)
      if (marks[mc[cc][zz]] == 0) {
        marks[mc[cc][zz]] = tt;
        ++ttt;
        if (ttt == 3) {
          ttt = 0;
          ++tt;
        }
      }
  }
  cout << "YES" << endl;
  for (int i = 0; i < n; ++i) cout << marks[i] << " ";
  cout << endl;
  return 0;
}
