#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;   }