#include <bits/stdc++.h>
using namespace std;
int n, m, k = 1, i, j, a, b, t;
vector<int> g[100010], s[2];
bool vis[100010];
int d[100010], f[100010];
void visit(int p, int d) {
  if (vis[p]) return;
  vis[p] = true;
  s[d].push_back(p);
  for (int i = 0; i < g[p].size(); i++) {
    visit(g[p][i], 1 - d);
  }
}
bool solve() {
  for (i = 0; i < s[0].size(); i++)
    if (g[s[0][i]].size() + 2 <= s[1].size() && d[s[0][i]] <= 0) break;
  if (i == s[0].size()) return false;
  i = s[0][i];
  d[i] = k;
  t = 0;
  for (int j = 0; j < n; j++) f[j] = false;
  for (int j = 0; j < g[i].size(); j++) f[g[i][j]] = true;
  for (int j = 0; j < s[1].size(); j++) {
    if (t >= 2) break;
    if (f[s[1][j]] == false) {
      d[s[1][j]] = k;
      t++;
    }
  }
  k++;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> a >> b;
    g[--a].push_back(--b);
    g[b].push_back(a);
  }
  for (int i = 0; i < n; i++)
    if (!vis[i]) visit(i, 0);
  if (s[0].size() % 3 == 2) swap(s[0], s[1]);
  if (s[0].size() % 3 == 1) {
    if (!solve()) {
      swap(s[0], s[1]);
      if (!(solve() && solve())) {
        cout << "NO" << endl;
        return 0;
      }
    }
  }
  t = 0;
  for (int ii = 0; ii < 2; ii++)
    for (int i = 0; i < s[ii].size(); i++) {
      if (t == 3) {
        k++;
        t = 0;
      }
      if (!d[s[ii][i]]) {
        d[s[ii][i]] = k;
        t++;
      }
    }
  cout << "YES" << endl;
  for (int i = 0; i < n; i++) cout << d[i] << " ";
  cout << endl;
}
