#include <bits/stdc++.h>
using namespace std;
int N, M;
vector<int> G[100005];
bool cycle;
int Stack[100005], Pos[100005], top;
bool Use[100005];
long long Val[100005], cnt;
int DP[100005];
void Print() {
  for (int i = 1; i <= N; i++) cout << Val[i] << " ";
  cout << "\n";
}
void Read() {
  cin >> N >> M;
  for (int i = 1; i <= M; i++) {
    int x, y;
    cin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
}
void DFS1(int node) {
  Use[node] = 1;
  Stack[++top] = node;
  Pos[node] = top;
  for (int i = 0; i < G[node].size(); i++) {
    int neighb = G[node][i];
    if (Use[neighb] == 1 && Pos[neighb] < top - 1) {
      if (cycle == 0) {
        cout << "YES\n";
        for (int j = Pos[neighb]; j <= top; j++) Val[Stack[j]] = 1;
        Print();
        cycle = 1;
      }
    } else if (Use[neighb] == 0)
      DFS1(neighb);
  }
  --top;
}
void Case2() {
  for (int i = 1; i <= N; i++)
    if (G[i].size() > 3 && cycle == 0) {
      Val[i] = 2;
      for (int j = 0; j < G[i].size(); j++) Val[G[i][j]] = 1;
      cycle = 1;
      cout << "YES\n";
      Print();
    }
}
void DFS2(int node) {
  Use[node] = 1;
  Stack[++top] = node;
  if (G[node].size() == 3) ++cnt;
  if (cnt == 2 && cycle == 0) {
    cycle = 1;
    for (int j = 1; j <= top; j++) Val[Stack[j]] = 2;
    for (int j = 0; j < G[Stack[1]].size(); j++) {
      int n = G[Stack[1]][j];
      if (Val[n] == 0) Val[n] = 1;
    }
    for (int j = 0; j < G[Stack[top]].size(); j++) {
      int n = G[Stack[top]][j];
      if (Val[n] == 0) Val[n] = 1;
    }
    cout << "YES\n";
    Print();
  }
  DP[node] = 1;
  for (int i = 0; i < G[node].size(); i++) {
    int neighb = G[node][i];
    if (Use[neighb] == 0) {
      DFS2(neighb);
      DP[node] += DP[neighb];
    }
  }
  --top;
}
long long GCD(long long a, long long b) {
  long long r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  return b;
}
void Case3() {
  int start = 0;
  for (int i = 1; i <= N; i++) Use[i] = 0;
  bool ok = 0;
  for (int i = 1; i <= N; i++)
    if (G[i].size() == 3 && Use[i] == 0) {
      top = 0;
      cnt = 0;
      DFS2(i);
      if (cnt == 1) {
        long long p = DP[G[i][0]], q = DP[G[i][1]], r = DP[G[i][2]];
        ++p;
        ++q;
        ++r;
        if (p * q + p * r + q * r <= p * q * r) {
          ok = 1;
        }
      }
    }
  if (cycle == 0) {
    if (ok == 0) {
      cout << "NO\n";
      return;
    }
    for (int i = 1; i <= N; i++)
      if (G[i].size() == 3) {
        long long p = DP[G[i][0]] + 1, q = DP[G[i][1]] + 1, r = DP[G[i][2]] + 1;
        if (p * q + p * r + q * r > p * q * r) {
          continue;
        }
        if (p >= 3 && q >= 3 && r >= 3) {
          p = 3;
          q = 3;
          r = 3;
        } else {
          if (p == 2) {
            if (q > 3 && r > 3) {
              q = 4;
              r = 4;
            } else {
              if (q > 3) {
                q = 6;
                r = 3;
              } else {
                q = 3;
                r = 6;
              }
            }
          }
          if (q == 2) {
            if (p > 3 && r > 3) {
              p = 4;
              r = 4;
            } else {
              if (p > 3) {
                p = 6;
                r = 3;
              } else {
                p = 3;
                r = 6;
              }
            }
          }
          if (r == 2) {
            if (p > 3 && q > 3) {
              p = 4;
              q = 4;
            } else {
              if (p > 3) {
                p = 6;
                q = 3;
              } else {
                p = 3;
                q = 6;
              }
            }
          }
        }
        int tot = p;
        tot = tot * q / GCD(tot, q);
        tot = tot * r / (GCD(tot, r));
        Val[i] = tot;
        int x[5];
        x[0] = p;
        x[1] = q;
        x[2] = r;
        for (int j = 0; j < 3; j++) {
          int sz = x[j];
          long long rat = (tot / sz), cnt = sz - 1, node = G[i][j];
          if (DP[G[i][j]] < sz - 1) {
            cout << "W\n";
            return;
          }
          while (cnt > 0) {
            Val[node] = cnt * rat;
            if (cnt == 1) break;
            if (Val[G[node][0]] != 0)
              node = G[node][1];
            else
              node = G[node][0];
            --cnt;
          }
        }
        cout << "YES\n";
        Print();
        return;
      }
    cout << "NO\n";
    return;
  }
}
int main() {
  int T;
  cin >> T;
  while (T--) {
    for (int i = 1; i <= N; i++) {
      G[i].clear();
      DP[i] = 0;
      Val[i] = 0;
      Use[i] = 0;
      Pos[i] = 0;
    }
    cycle = 0;
    Read();
    for (int i = 1; i <= N; i++)
      if (Use[i] == 0) {
        top = 0;
        DFS1(i);
      }
    if (cycle == 1) continue;
    Case2();
    if (cycle == 1) continue;
    Case3();
  }
  return 0;
}
