#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long num = 0, neg = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    num = (num << 3) + (num << 1) + c - '0';
    c = getchar();
  }
  return num * neg;
}
int T, n, m;
bool vis[100010], tag[200010];
int cnt = 1, to[200010], nxt[200010], head[100010], fr[200010], in[100010];
int dep[100010], fa[100010], size[100010], id[100010], dfn, son[100010],
    bel[100010];
long long top[100010], len[100010], p[100010], ans[100010];
inline void insert(int x, int y) {
  fr[++cnt] = x, to[cnt] = y, nxt[cnt] = head[x], head[x] = cnt, in[y]++;
  tag[cnt] = 0;
}
inline void dfs1(int u, int f, int k) {
  dep[u] = dep[f] + 1, fa[u] = f, size[u] = 1, id[u] = ++dfn, bel[u] = k;
  int maxson = 0;
  vis[u] = 1;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (vis[v]) continue;
    tag[i] = tag[i ^ 1] = 1;
    dfs1(v, u, k), size[u] += size[v];
    if (size[maxson] < size[v]) maxson = v;
  }
  son[u] = maxson;
  return;
}
inline void dfs2(int u, int topf) {
  top[u] = topf;
  vis[u] = 0;
  if (!son[u]) return;
  dfs2(son[u], topf);
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v == fa[u] || v == son[u] || !vis[v]) continue;
    dfs2(v, v);
  }
  return;
}
inline int LCA(int x, int y) {
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    x = fa[top[x]];
  }
  if (dep[x] > dep[y]) swap(x, y);
  return x;
}
inline bool check1(int k) {
  int pos = 0, u, v, lca;
  for (int i = 2; i <= cnt; i += 2) {
    if (bel[fr[i]] != k || bel[to[i]] != k) continue;
    if (tag[i]) continue;
    pos = 1;
    break;
  }
  if (pos) {
    printf("YES\n");
    for (int i = 1; i <= n; i++) printf("%d ", bel[i] == k);
    printf("\n");
    return 1;
  }
  return 0;
}
inline bool check2(int k) {
  for (int i = 1; i <= n; i++)
    if (in[i] > 3 && bel[i] == k) {
      memset(ans, 0, sizeof(ans));
      ans[i] = 2;
      for (int j = head[i], tot = 0; j, tot < 4; j = nxt[j], tot++)
        ans[to[j]] = 1;
      printf("YES\n");
      for (int j = 1; j <= n; j++) printf("%d ", ans[j]);
      printf("\n");
      return 1;
    }
  return 0;
}
inline bool check3(int k) {
  int tot = 0;
  for (int i = 1; i <= n; i++)
    if (in[i] == 3 && bel[i] == k) p[++tot] = i;
  if (tot > 1) {
    memset(ans, 0, sizeof(ans));
    int lca = p[1];
    for (int i = 2; i <= tot; i++) lca = LCA(lca, p[i]);
    for (int i = 1; i <= tot; i++) {
      int u = p[i];
      while (!ans[u] && u != lca) ans[u] = 2, u = fa[u];
    }
    ans[lca] = 2;
    for (int i = 1; i <= n; i++)
      if (!ans[i] && bel[i] == k) ans[i] = 1;
    printf("YES\n");
    for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
    return 1;
  }
  return 0;
}
inline int getlen(int u, int fa) {
  int res = 0;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v == fa) continue;
    res = getlen(v, u);
  }
  return res + 1;
}
inline int fillin(int u, int fa, int delta) {
  ans[u] = ans[fa] - delta;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v == fa) continue;
    fillin(v, u, delta);
  }
}
inline int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
inline long long lcm(long long x, long long y) { return x / gcd(x, y) * y; }
inline bool check4(int k) {
  for (int i = 1; i <= n; i++)
    if (in[i] == 3 && bel[i] == k) {
      memset(ans, 0, sizeof(ans));
      int tot = 0;
      double tmp;
      int p = 0, q = 0, r = 0;
      for (int j = head[i]; j; j = nxt[j]) {
        if (!p)
          p = len[to[j]] = getlen(to[j], i) + 1;
        else if (!q)
          q = len[to[j]] = getlen(to[j], i) + 1;
        else if (!r)
          r = len[to[j]] = getlen(to[j], i) + 1;
      }
      if (1ll * p * r + 1ll * q * r + 1ll * p * q > 1ll * p * q * r) return 0;
      ans[i] = min(lcm(lcm(p, q), r), 1000000ll);
      for (int j = head[i]; j; j = nxt[j])
        fillin(to[j], i, ans[i] / len[to[j]]);
      printf("YES\n");
      for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
      printf("\n");
      return 1;
    }
  return 0;
}
int main() {
  T = read();
  while (T--) {
    n = read(), m = read();
    cnt = 1, dep[1] = 0, dfn = 0;
    for (int i = 1; i <= n; i++) id[i] = bel[i] = head[i] = in[i] = vis[i] = 0;
    for (int i = 1, x, y; i <= m; i++) {
      x = read(), y = read();
      insert(x, y), insert(y, x);
    }
    dep[1] = 0, dfn = 0;
    bool fail = 1;
    int num = 0;
    for (int i = 1; i <= n; i++)
      if (!id[i]) {
        dep[i] = 0, dfn = 0, dfs1(i, i, ++num), dfs2(i, i);
        if (check1(num)) {
          fail = 0;
          break;
        }
        if (check2(num)) {
          fail = 0;
          break;
        }
        if (check3(num)) {
          fail = 0;
          break;
        }
        if (check4(num)) {
          fail = 0;
          break;
        }
      }
    if (fail) printf("NO\n");
  }
  return 0;
}
