#include <bits/stdc++.h>
using namespace std;
using VI = vector<int>;
const int NN = 1e5 + 10;
VI adj[NN];
int flag[NN];
int val[NN];
int dep[NN];
VI path;
void dfs(int u) {
  flag[u] = 0;
  path.push_back(u);
  for (auto v : adj[u])
    if (flag[v]) dfs(v);
}
void Erase(int u, int v) {
  for (int i = 0; i < adj[u].size(); i++) {
    if (adj[u][i] == v) {
      swap(adj[u][i], adj[u].back());
      adj[u].pop_back();
      return;
    }
  }
}
int calc(int u, int fa) {
  int ans = 1;
  for (auto v : adj[u]) {
    if (v == fa) continue;
    ans += calc(v, u);
    Erase(v, u);
  }
  return ans;
}
int main() {
  int test, n, m;
  scanf("%d", &test);
  while (test--) {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) adj[i].clear(), flag[i] = 1, val[i] = 0;
    for (int i = 0, u, v; i < m; i++) {
      scanf("%d %d", &u, &v);
      adj[u].push_back(v);
      adj[v].push_back(u);
    }
    int ok = 0;
    for (int i = 1; i <= n && ok == 0; i++)
      if (flag[i]) {
        path.clear();
        dfs(i);
        if (path.size() <= 2) continue;
        int cnt = 0, tot = 0;
        for (auto r : path) {
          cnt += (adj[r].size() == 1);
          tot += adj[r].size();
        }
        tot /= 2;
        if (tot >= path.size()) {
          ok = 1;
          for (auto r : path) val[r] = 1;
          continue;
        }
        if (cnt >= 4) {
          ok = 1;
          for (auto r : path) {
            if (adj[r].size() == 1)
              val[r] = 1;
            else
              val[r] = 2;
          }
          continue;
        }
        if (cnt < 3) continue;
        int r;
        for (auto u : path)
          if (adj[u].size() == 3) r = u;
        for (int j = 0; j < 3; j++) {
          Erase(adj[r][j], r);
          dep[adj[r][j]] = calc(adj[r][j], r);
        }
        sort(adj[r].begin(), adj[r].end(),
             [&](int a, int b) { return dep[a] < dep[b]; });
        if (dep[adj[r][0]] >= 2) {
          ok = 1;
          val[r] = 3;
          for (int j = 0; j < 3; j++) {
            for (int i = 2, v = adj[r][j]; i; i--) {
              val[v] = i;
              if (i > 1) v = adj[v][0];
            }
          }
        } else if (dep[adj[r][1]] == 2) {
          if (dep[adj[r][2]] < 5) continue;
          ok = 1;
          val[r] = 6;
          val[adj[r][0]] = 3;
          val[adj[r][1]] = 4;
          val[adj[adj[r][1]][0]] = 2;
          for (int i = 5, v = adj[r][2]; i; i--) {
            val[v] = i;
            if (i > 1) v = adj[v][0];
          }
        } else if (dep[adj[r][1]] > 2) {
          ok = 1;
          val[r] = 4;
          val[adj[r][0]] = 2;
          for (int i = 3, v = adj[r][1]; i; i--) {
            val[v] = i;
            if (i > 1) v = adj[v][0];
          }
          for (int i = 3, v = adj[r][2]; i; i--) {
            val[v] = i;
            if (i > 1) v = adj[v][0];
          }
        }
      }
    if (ok) {
      puts("YES");
      for (int i = 1; i <= n; i++) {
        if (i < n)
          printf("%d ", val[i]);
        else
          printf("%d\n", val[i]);
      }
    } else
      puts("NO");
  }
  return 0;
}
