#include <bits/stdc++.h>
using namespace std;
template <class _T>
inline _T sqr(const _T& x) {
  return x * x;
}
template <class _T>
inline string tostr(const _T& a) {
  ostringstream os("");
  os << a;
  return os.str();
}
const long double PI = 3.1415926535897932384626433832795;
const long double EPS = 1e-11;
int n, m;
vector<int> a[102400];
bool c[102400];
bool u[102400];
bool u2[102400];
int ans[102400];
int cl;
void dfs(int v, bool cc) {
  c[v] = cc;
  u[v] = true;
  for (int i = 0; i < (int)(a[v].size()); i++) {
    if (!u[a[v][i]]) {
      dfs(a[v][i], !cc);
    }
  }
}
bool solve12() {
  int k2 = n - cl;
  int mi = 10000000;
  int mj = -1;
  for (int i = 0; i < (int)(n); i++) {
    if (c[i]) {
      if ((int)a[i].size() < mi) {
        mi = a[i].size();
        mj = i;
      }
    }
  }
  if (mi <= k2 - 2) {
    memset((u), 0, sizeof(u));
    u[mj] = true;
    memset((u2), 0, sizeof(u2));
    ans[mj] = 0;
    for (int i = 0; i < (int)(a[mj].size()); i++) {
      u2[a[mj][i]] = true;
    }
    int cnt = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (!c[i] && !u2[i]) {
        cnt++;
        u[i] = true;
        ans[i] = 0;
        if (cnt == 2) break;
      }
    }
    int c0 = 0, c1 = 0;
    int k = 1;
    int cur0 = 0, cur1 = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (u[i]) continue;
      if (c[i]) {
        if (c0 == 0) cur0 = k++;
        if (++c0 == 3) c0 = 0;
        ans[i] = cur0;
      } else {
        if (c1 == 0) cur1 = k++;
        if (++c1 == 3) c1 = 0;
        ans[i] = cur1;
      }
    }
    return true;
  }
  return false;
}
bool solve2211() {
  for (int i = 0; i < (int)(n); i++) {
    c[i] = !c[i];
  }
  cl = n - cl;
  int k2 = n - cl;
  int mi = 10000000;
  int mj1 = -1;
  int mj2 = -1;
  for (int i = 0; i < (int)(n); i++) {
    if (c[i]) {
      if ((int)a[i].size() < mi) {
        mi = a[i].size();
        mj1 = i;
      }
    }
  }
  mi = 10000000;
  for (int i = 0; i < (int)(n); i++) {
    if (i == mj1) continue;
    if (c[i]) {
      if ((int)a[i].size() < mi) {
        mi = a[i].size();
        mj2 = i;
      }
    }
  }
  if (mi <= k2 - 2) {
    memset((u), 0, sizeof(u));
    u[mj1] = true;
    u[mj2] = true;
    ans[mj1] = 0;
    ans[mj2] = 1;
    memset((u2), 0, sizeof(u2));
    for (int i = 0; i < (int)(a[mj1].size()); i++) {
      u2[a[mj1][i]] = true;
    }
    int cnt = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (!c[i] && !u2[i]) {
        cnt++;
        u[i] = true;
        ans[i] = 0;
        if (cnt == 2) break;
      }
    }
    memset((u2), 0, sizeof(u2));
    for (int i = 0; i < (int)(a[mj2].size()); i++) {
      u2[a[mj2][i]] = true;
    }
    cnt = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (!c[i] && !u2[i]) {
        cnt++;
        u[i] = true;
        ans[i] = 1;
        if (cnt == 2) break;
      }
    }
    int c0 = 0, c1 = 0;
    int k = 2;
    int cur0 = 0, cur1 = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (u[i]) continue;
      if (c[i]) {
        if (c0 == 0) cur0 = k++;
        if (++c0 == 3) c0 = 0;
        ans[i] = cur0;
      } else {
        if (c1 == 0) cur1 = k++;
        if (++c1 == 3) c1 = 0;
        ans[i] = cur1;
      }
    }
    return true;
  }
  return false;
}
int main() {
  cout << setiosflags(ios::fixed) << setprecision(10);
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (int)(m); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    a[x].push_back(y);
    a[y].push_back(x);
  }
  memset((u), 0, sizeof(u));
  for (int i = 0; i < (int)(n); i++) {
    if (!u[i]) {
      dfs(i, true);
    }
  }
  cl = 0;
  for (int i = 0; i < (int)(n); i++) {
    cl += c[i];
  }
  if (cl % 3 == 0) {
    int c0 = 0, c1 = 0;
    int k = 0;
    int cur0 = 0, cur1 = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (c[i]) {
        if (c0 == 0) cur0 = k++;
        if (++c0 == 3) c0 = 0;
        ans[i] = cur0;
      } else {
        if (c1 == 0) cur1 = k++;
        if (++c1 == 3) c1 = 0;
        ans[i] = cur1;
      }
    }
  } else {
    if (cl % 3 == 2) {
      for (int i = 0; i < (int)(n); i++) {
        c[i] = !c[i];
      }
      cl = n - cl;
    }
    if (!solve12() && !solve2211()) {
      puts("NO");
      return 0;
    }
  }
  puts("YES");
  for (int i = 0; i < (int)(n); i++) {
    printf("%d%c", ans[i] + 1, " \n"[i == n - 1]);
  }
  return 0;
}
