#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int T, n, m;
int edge, ver;
bool mark[N];
int ans[N];
vector<int> G[N], seen, path;
void dfs(int v) {
  ver++;
  edge += G[v].size();
  mark[v] = true;
  seen.push_back(v);
  for (int u : G[v])
    if (!mark[u]) dfs(u);
}
void refresh() {
  for (int i = 0; i < n; i++) {
    ans[i] = mark[i] = 0;
    G[i].clear();
  }
}
bool DFS(int v) {
  mark[v] = true;
  path.push_back(v);
  if (G[v].size() == 3 && path.size() > 1) return true;
  for (int u : G[v])
    if (!mark[u])
      if (DFS(u)) return true;
  path.pop_back();
  return false;
}
int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &n, &m);
    for (int i = 0; i < m; i++) {
      int v, u;
      scanf("%d %d", &v, &u);
      v--, u--;
      G[v].push_back(u);
      G[u].push_back(v);
    }
    bool ok = false;
    for (int i = 0; i < n; i++)
      if (!mark[i]) {
        edge = ver = 0;
        seen.clear();
        dfs(i);
        edge >>= 1;
        if (edge >= ver) {
          for (int id : seen) ans[id] = 1;
          ok = true;
          break;
        }
      }
    for (int i = 0; i < n; i++)
      if (!ok && G[i].size() >= 4) {
        ok = true;
        ans[i] = 2;
        for (int u : G[i]) ans[u] = 1;
        break;
      }
    for (int i = 0; i < n; i++)
      if (!ok && G[i].size() == 3)
        for (int u : G[i])
          if (G[u].size() == 3) {
            ok = true;
            for (int p : G[i]) ans[p] = 1;
            for (int p : G[u]) ans[p] = 1;
            ans[u] = ans[i] = 2;
            break;
          }
    for (int i = 0; i < n; i++)
      if (!ok && G[i].size() == 3) {
        bool can = true;
        for (int u : G[i])
          if (G[u].size() == 1) can = false;
        if (can) {
          ok = true;
          for (int u : G[i]) {
            for (int k : G[u]) ans[k] = 1;
            ans[u] = 2;
          }
          ans[i] = 3;
          break;
        }
      }
    for (int i = 0; i < n; i++)
      if (!ok && G[i].size() == 3) {
        int cnt = 0;
        for (int u : G[i])
          for (int k : G[u])
            if (k != i && G[k].size() >= 2) cnt++;
        if (cnt == 2) {
          ok = true;
          ans[i] = 4;
          for (int u : G[i]) {
            bool cc = false;
            for (int k : G[u])
              if (k != i && G[k].size() >= 2) cc = true;
            if (!cc) {
              ans[u] = 2;
              continue;
            }
            for (int k : G[u])
              if (k != i) {
                for (int p : G[k]) ans[p] = 1;
                ans[k] = 2;
              }
            ans[u] = 3;
          }
          break;
        }
      }
    for (int i = 0; i < n; i++)
      if (!ok && G[i].size() == 2) {
        bool can = true;
        for (int u : G[i])
          if (G[u].size() != 3) can = false;
        if (can) {
          ok = true;
          for (int u : G[i]) {
            for (int k : G[u]) ans[k] = 1;
            ans[u] = 2;
          }
          ans[i] = 2;
          break;
        }
      }
    for (int i = 0; i < n; i++)
      if (!ok && G[i].size() == 3) {
        bool can = false;
        int A, B;
        for (int u : G[i])
          for (int u2 : G[i])
            if (u != u2) {
              if (G[u2].size() != 2) continue;
              for (int k1 : G[u])
                if (k1 != i)
                  for (int k2 : G[k1])
                    if (k2 != u)
                      for (int k3 : G[k2])
                        if (k3 != k1)
                          for (int k4 : G[k3])
                            if (k4 != k2) {
                              can = true;
                              A = u, B = u2;
                            }
            }
        if (can) {
          ok = true;
          ans[i] = 6;
          for (int k : G[i])
            if (k != A && k != B) ans[k] = 3;
          ans[B] = 4;
          for (int k : G[B])
            if (k != i) ans[k] = 2;
          ans[A] = 5;
          for (int k1 : G[A])
            if (k1 != i) {
              ans[k1] = 4;
              for (int k2 : G[k1])
                if (k2 != A) {
                  ans[k2] = 3;
                  for (int k3 : G[k2])
                    if (k3 != k1) {
                      ans[k3] = 2;
                      for (int k4 : G[k3])
                        if (k4 != k2) ans[k4] = 1;
                    }
                }
            }
          break;
        }
      }
    for (int i = 0; i < n; i++) mark[i] = false;
    for (int i = 0; i < n; i++)
      if (!ok && !mark[i] && G[i].size() == 3) {
        path.clear();
        if (DFS(i)) {
          ok = true;
          for (int u : G[path[0]]) ans[u] = 1;
          for (int u : G[path.back()]) ans[u] = 1;
          for (int u : path) ans[u] = 2;
          break;
        }
      }
    if (ok) {
      printf("YES\n");
      for (int i = 0; i < n; i++) printf("%d\n", ans[i]);
      printf("\n");
    } else
      printf("NO\n");
    refresh();
  }
  return 0;
}
