#include <bits/stdc++.h>
using namespace std;
vector<int> now;
int tot, center, sz, cnt, vis[100010], color, type, val[100010], n, T, m, x, y;
vector<int> v[100010], w[100010];
void dfs(int x) {
  vis[x] = color;
  cnt++;
  sz += v[x].size();
  if (v[x].size() == 1) tot++;
  if (v[x].size() == 3 && center == 0) center = x;
  for (auto y : v[x]) {
    if (vis[y]) continue;
    dfs(y);
  }
}
bool DFS(int x) {
  int a = v[x][0], b = v[x][1], c = v[x][2];
  int cur = a, pre = x, szA = 1, szB = 1, szC = 1;
  w[a].push_back(a);
  while (v[cur].size() == 2) {
    szA++;
    for (auto y : v[cur]) {
      if (y != pre) {
        pre = cur;
        cur = y;
        w[a].push_back(cur);
        break;
      }
    }
  }
  cur = b, pre = x;
  w[b].push_back(b);
  while (v[cur].size() == 2) {
    szB++;
    for (auto y : v[cur]) {
      if (y != pre) {
        pre = cur;
        cur = y;
        w[b].push_back(cur);
        break;
      }
    }
  }
  cur = c, pre = x;
  w[c].push_back(c);
  while (v[cur].size() == 2) {
    szC++;
    for (auto y : v[cur]) {
      if (y != pre) {
        pre = cur;
        cur = y;
        w[c].push_back(cur);
        break;
      }
    }
  }
  if (szA > szB) {
    swap(a, b);
    swap(szA, szB);
  }
  if (szA > szC) {
    swap(a, c);
    swap(szA, szC);
  }
  if (szB > szC) {
    swap(b, c);
    swap(szB, szC);
  }
  if (szA >= 2) {
    val[x] = 3;
    val[a] = 2, val[b] = 2, val[c] = 2;
    val[w[a][1]] = val[w[b][1]] = val[w[c][1]] = 1;
    puts("YES");
    for (int i = 1; i <= n; i++) {
      printf("%d ", val[i]);
    }
    puts("");
    return true;
  }
  if (szA == 1) {
    if (szB == 1) {
      return false;
    }
    if (szB >= 3) {
      int tmp = 4;
      val[a] = 2;
      val[x] = 4;
      for (int i = 0; i < 3; i++) {
        val[w[b][i]] = 3 - i;
        val[w[c][i]] = 3 - i;
      }
      puts("YES");
      for (int i = 1; i <= n; i++) {
        printf("%d ", val[i]);
      }
      puts("");
      return true;
    }
    if (szB == 2) {
      if (szC < 5) return false;
      if (szC >= 5) {
        val[a] = 6;
        val[b] = 8;
        val[x] = 12;
        val[w[b][1]] = 4;
        for (int i = 0; i < 5; i++) {
          val[w[c][i]] = (5 - i) * 2;
        }
        puts("YES");
        for (int i = 1; i <= n; i++) {
          printf("%d ", val[i]);
        }
        puts("");
        return true;
      }
    }
  }
}
int main() {
  for (scanf("%d", &T); T--;) {
    scanf("%d %d", &n, &m);
    for (int i = 0; i <= n; i++) {
      vis[i] = 0;
      val[i] = 0;
      v[i].clear();
      w[i].clear();
    }
    color = 0;
    type = 0;
    for (int i = 1; i <= m; i++) {
      scanf("%d %d", &x, &y);
      v[x].push_back(y);
      v[y].push_back(x);
    }
    for (int i = 1; i <= n; i++)
      if (vis[i] == 0) {
        ++color;
        cnt = 0;
        sz = 0;
        tot = 0;
        center = 0;
        dfs(i);
        if (sz >= cnt * 2) {
          type = 1;
          break;
        }
        if (tot >= 4) {
          type = 2;
          break;
        }
        if (center) {
          if (DFS(center)) {
            type = 3;
            break;
          }
        }
      }
    if (type == 1) {
      puts("YES");
      for (int i = 1; i <= n; i++) {
        if (vis[i] == color)
          printf("1 ");
        else
          printf("0 ");
      }
      puts("");
      continue;
    }
    if (type == 2) {
      puts("YES");
      for (int i = 1; i <= n; i++) {
        if (vis[i] == color) {
          if (v[i].size() == 1)
            printf("1 ");
          else
            printf("2 ");
        } else
          printf("0 ");
      }
      puts("");
      continue;
    }
    if (type == 3) {
      continue;
    }
    puts("NO");
  }
}
