#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, T, vis[N], qq[N];
int fa[N], ans[N], q[50];
int dep[N], flg;
vector<int> e[N];
void construct1(int x, int y) {
  if (flg) return;
  flg = 1;
  for (int i = (int)(1); i <= (int)(n); i++) ans[i] = (i == y);
  for (; x != y; x = fa[x]) ans[x] = 1;
  puts("YES");
  for (int i = (int)(1); i <= (int)(n); i++) printf("%d ", ans[i]);
  puts("");
}
void construct2(int x) {
  if (flg) return;
  flg = 1;
  for (int i = (int)(1); i <= (int)(n); i++) ans[i] = (vis[i] == T);
  ans[x] = 2;
  puts("YES");
  for (int i = (int)(1); i <= (int)(n); i++) printf("%d ", ans[i]);
  puts("");
}
void construct3(int x, int y) {
  if (flg) return;
  flg = 1;
  for (int i = (int)(1); i <= (int)(n); i++) ans[i] = (vis[i] == T);
  for (; x != y; ans[x] = 2, x = fa[x])
    if (dep[x] < dep[y]) swap(x, y);
  ans[x] = 2;
  puts("YES");
  for (int i = (int)(1); i <= (int)(n); i++) printf("%d ", ans[i]);
  puts("");
}
void construct4(int v1, int v2, int v3, int p) {
  if (flg) return;
  flg = 1;
  for (int i = (int)(1); i <= (int)(n); i++) ans[i] = 0;
  ans[p] = v3;
  for (int x = q[1]; x != p; x = fa[x])
    if (dep[x] <= v1) ans[x] = v3 - (dep[x] - 1) * v3 / v1;
  for (int x = q[2]; x != p; x = fa[x])
    if (dep[x] <= v2) ans[x] = v3 - (dep[x] - 1) * v3 / v2;
  for (int x = q[3]; x != p; x = fa[x])
    if (dep[x] <= v3) ans[x] = v3 - (dep[x] - 1) * v3 / v3;
  puts("YES");
  for (int i = (int)(1); i <= (int)(n); i++) printf("%d ", ans[i]);
  puts("");
}
void dfs(int x) {
  qq[++*qq] = x;
  vis[x] = T;
  for (auto i : e[x])
    if (i != fa[x])
      if (vis[i] != T) {
        dep[i] = dep[x] + 1;
        fa[i] = x;
        dfs(i);
      } else
        construct1(x, i);
}
int tryAtry(int x) {
  ++T;
  *qq = 0;
  fa[x] = 0;
  dep[x] = 1;
  dfs(x);
  if (flg) return 1;
  for (int i = (int)(1); i <= (int)(*qq); i++)
    if (e[qq[i]].size() >= 4) return construct2(qq[i]), 1;
  int las = -1;
  for (int i = (int)(1); i <= (int)(*qq); i++)
    if (e[qq[i]].size() >= 3)
      if (las == -1)
        las = qq[i];
      else
        return construct3(qq[i], las), 1;
  if (las == -1) return 0;
  ++T;
  *qq = *q = 0;
  fa[las] = 0;
  dep[las] = 1;
  dfs(las);
  for (int i = (int)(1); i <= (int)(*qq); i++)
    if (e[qq[i]].size() == 1) q[++*q] = qq[i];
  assert(*q == 3);
  for (int i = (int)(1); i <= (int)(3); i++)
    for (int j = (int)(i + 1); j <= (int)(3); j++)
      if (dep[q[i]] > dep[q[j]]) swap(q[i], q[j]);
  double tmp = 1.0 / dep[q[1]] + 1.0 / dep[q[2]] + 1.0 / dep[q[3]];
  if (tmp > 1.0 + 1e-9) return 0;
  if (dep[q[1]] >= 3)
    construct4(3, 3, 3, las);
  else if (dep[q[2]] >= 4)
    construct4(2, 4, 4, las);
  else
    construct4(2, 3, 6, las);
  return 1;
}
void solve() {
  flg = 0;
  scanf("%d%d", &n, &m);
  for (int i = (int)(1); i <= (int)(n); i++) e[i].resize(0);
  for (int i = (int)(1); i <= (int)(m); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[x].push_back(y);
    e[y].push_back(x);
  }
  int yyn = T;
  for (int i = (int)(1); i <= (int)(n); i++)
    if (vis[i] <= yyn) {
      tryAtry(i);
      if (flg) return;
    }
  puts("NO");
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) solve();
}
