#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, p[N], in[N], tot, ans[N], l, r, b[N], c[N];
vector<int> G[N];
inline int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f * x;
}
inline bool dfs(int u, int s) {
  p[u] = s;
  s == 0 ? l++ : r++;
  for (auto v : G[u]) {
    if (p[u] == p[v]) return 0;
    if (p[v] == -1 && !dfs(v, s ^ 1)) return 0;
  }
  return 1;
}
inline void print() {
  stack<int> s[2];
  for (int i = (1), iend = (n); i <= iend; i++)
    if (p[i] != -1) {
      s[p[i]].push(i);
      for (int j = (0), jend = (1); j <= jend; j++)
        if (s[j].size() == 3) {
          tot++;
          while (!s[j].empty()) ans[s[j].top()] = tot, s[j].pop();
        }
    }
  printf("YES\n");
  for (int i = (1), iend = (n); i <= iend; i++) printf("%d ", ans[i]);
}
int main() {
  n = read(), m = read();
  memset(p, -1, sizeof(p));
  for (int i = (1), iend = (m); i <= iend; i++) {
    int x = read(), y = read();
    G[x].push_back(y), G[y].push_back(x);
    in[x]++, in[y]++;
  }
  for (int i = (1), iend = (n); i <= iend; i++)
    if (p[i] == -1) dfs(i, 0);
  if (l % 3 == 0 && r % 3 == 0) return print(), 0;
  if (l % 3 == 2 && r % 3 == 1) {
    for (int i = (1), iend = (n); i <= iend; i++) p[i] ^= 1;
    swap(l, r);
  }
  for (int i = (1), iend = (n); i <= iend; i++)
    if (p[i] == 0 && in[i] <= r - 2) {
      for (auto v : G[i]) b[v] = 1;
      stack<int> s;
      for (int j = (1), jend = (n); j <= jend; j++)
        if (p[j] == 1 && !b[j]) s.push(j);
      p[i] = -1, tot++, ans[i] = tot;
      for (int j = (0), jend = (1); j <= jend; j++)
        p[s.top()] = -1, ans[s.top()] = tot, s.pop();
      print();
      return 0;
    }
  stack<int> o;
  for (int i = (1), iend = (n); i <= iend; i++)
    if (p[i] == 1 && in[i] <= l - 2) o.push(i);
  if (o.size() >= 2) {
    int t1 = o.top(), a1 = 2, a2 = 2;
    o.pop();
    int t2 = o.top();
    ans[t1] = tot + 1, ans[t2] = tot + 2;
    p[t1] = p[t2] = -1;
    for (auto v : G[t1]) b[v] = 1;
    for (auto v : G[t2]) c[v] = 1;
    for (int i = (1), iend = (n); i <= iend; i++)
      if (p[i] == 0) {
        if (a1 && !b[i])
          a1--, p[i] = -1, ans[i] = tot + 1;
        else if (a2 && !c[i])
          a2--, p[i] = -1, ans[i] = tot + 2;
      }
    tot += 2;
    print();
    return 0;
  }
  printf("NO");
  return 0;
}
