#include <bits/stdc++.h>
using namespace std;
template <typename T>
void r1(T &x) {
  x = 0;
  char c(getchar());
  int f(1);
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') f = -1;
  for (; '0' <= c && c <= '9'; c = getchar()) x = (x * 10) + (c ^ 48);
  x *= f;
}
const int mod = 1e9 + 7;
template <typename T, typename... Args>
inline void r1(T &t, Args &...args) {
  r1(t);
  r1(args...);
}
const int maxn = 2e5 + 5;
vector<int> vc[3];
int head[maxn], cnt;
int n, m;
int deg[maxn];
struct Edge {
  int to, next;
} edg[maxn << 1];
void add(int u, int v) {
  edg[++cnt] = (Edge){v, head[u]}, head[u] = cnt, ++deg[v];
}
int vis[maxn], col[maxn];
void dfs(int p, int pre) {
  vis[p] = 0;
  if (!col[p]) col[p] = 1;
  for (int i = head[p]; i; i = edg[i].next) {
    int to = edg[i].to;
    if (to == pre) continue;
    if (vis[to]) dfs(to, p);
  }
}
int getCir(int p, int pre) {
  vis[p] = 1;
  for (int i = head[p]; i; i = edg[i].next) {
    int to = edg[i].to;
    if (to == pre) continue;
    if (vis[to]) return 1;
    if (getCir(to, p)) return 1;
  }
  return 0;
}
int getdeg(int p, int pre) {
  if (pre && deg[p] == 3) return col[p] = 2, 1;
  for (int i = head[p]; i; i = edg[i].next) {
    int to = edg[i].to;
    if (to == pre) continue;
    if (getdeg(to, p)) return col[p] = 2, 1;
  }
  return 0;
}
void getline(int p, int pre, int opt) {
  vc[opt].push_back(p);
  for (int i = head[p]; i; i = edg[i].next) {
    int to = edg[i].to;
    if (to == pre) continue;
    getline(to, p, opt);
  }
}
bool cmp(const vector<int> &a, const vector<int> &b) {
  return a.size() < b.size();
}
signed main() {
  auto Print = [&](int opt) {
    if (opt == 0) return puts("NO"), void();
    puts("YES");
    for (int i = 1; i <= n; ++i) printf("%d%c", col[i], " \n"[i == n]);
    return;
  };
  auto WorK = [&]() {
    int i, j, flag(0);
    r1(n, m);
    for (i = 0; i < 3; ++i) vc[i].clear();
    for (i = 1; i <= n; ++i) vis[i] = head[i] = col[i] = deg[i] = 0;
    cnt = 0;
    for (i = 1; i <= m; ++i) {
      int u, v;
      r1(u, v);
      add(u, v), add(v, u);
    }
    for (i = 1; !flag && i <= n; ++i)
      if (!vis[i]) {
        if ((flag = getCir(i, 0))) dfs(i, 0);
      }
    for (i = 1; !flag && i <= n; ++i)
      if (deg[i] > 3) {
        flag = 1;
        col[i] = 2, dfs(i, 0);
      }
    for (i = 1; !flag && i <= n; ++i)
      if (deg[i] == 3) {
        if ((flag = getdeg(i, 0))) {
          col[i] = 2;
          dfs(i, 0);
        }
      }
    for (i = 1; !flag && i <= n; ++i)
      if (deg[i] == 3) {
        int tot(0);
        for (int x = 0; x < 3; ++x) vc[x].clear();
        for (int j = head[i]; j; j = edg[j].next) {
          int to = edg[j].to;
          getline(to, i, tot++);
        }
        sort(vc, vc + 3, cmp);
        if (vc[1].size() == 1 ||
            (vc[1].size() == 2 && vc[0].size() == 1 && vc[2].size() < 5))
          continue;
        flag = 1;
        if (vc[2].size() >= 5) {
          col[i] = 6;
          col[vc[0][0]] = 3, col[vc[1][0]] = 4;
          col[vc[1][1]] = 2;
          for (j = 0; j < 5; ++j) col[vc[2][j]] = 5 - j;
        } else {
          col[i] = (vc[0].size() + 1) * (vc[1].size() + 1) * (vc[2].size() + 1);
          for (j = 0; j < 3; ++j)
            for (int k = 0; k < vc[j].size(); ++k)
              col[vc[j][k]] = col[i] / (vc[j].size() + 1) * (vc[j].size() - k);
        }
      }
    Print(flag);
  };
  int T;
  r1(T);
  while (T--) WorK();
  return 0;
}
