#include <bits/stdc++.h>   using namespace std;   const int N = 5000 * 100 + 5;   int n, m, a, b, c, av, bv, cv, t, h[N], cnt, par[N], y, ans[N], cntA, col,       ca[N], o, uwu;   vector<int> adj[N], pa;   bool mark[N], vis[N], flag2, g[N];   void bfs(int v) {     queue<int> q;     par[v] = -1;     q.push(v);     flag2 = false;     while (q.size() && !flag2) {       v = q.front();       q.pop();       for (auto u : adj[v])         if (!par[u]) {           par[u] = v, q.push(u);           if (adj[u].size() % 3 == 1 && !flag2) y = u, flag2 = true;         }     }   }   void dfs3(int v, int co, int p = -1) {     pa.push_back(v);     if (!flag2)       for (auto u : adj[v])         if (u == bv && u != p) {           for (auto i : pa) vis[i] = true;           flag2 = true, uwu++;         }     for (auto u : adj[v])       if (u != p && !flag2 && ca[u] == co) dfs3(u, co, v), pa.pop_back();   }   void dfs(int v) {     ca[v] = col;     for (auto u : adj[v])       if (!ca[u] && u != bv) dfs(u);   }   void dfs2(int v, int p = -1) {     ans[cntA++] = v;     g[v] = true;     int l = 0;     bool flag = false;     for (auto u : adj[v])       if (h[u] > h[l] && u != p) {         l = u;       }     if (!cnt && l)       for (int i = 0; i < cntA; i++) {         if (l == ans[i]) flag = true;         if (flag) mark[ans[i]] = true, cnt++;       }     for (auto u : adj[v])       if (!cnt && !h[u] && adj[u].size() % 3 == 2)         h[u] = h[v] + 1, dfs2(u, v), ans[--cntA] = 0;   }   int main() {     ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);     cin >> t;     for (o = 1; o <= t; o++) {       cin >> n >> m;       for (int i = 0, v, u; i < m; i++) {         cin >> v >> u;         adj[v].push_back(u);         adj[u].push_back(v);       }       for (int i = 1; i <= n; i++) {         if (adj[i].size() % 3 == 0)           a++, av = i;         else if (adj[i].size() % 3 == 1)           b++, bv = i;         else           c++, cv = i;       }       if (a) {         if (n == 1)           cout <<  NO n ;         else {           cout <<  YES n  << n - 1 <<   n ;           for (int i = 1; i <= n; i++)             if (i != av) cout << i <<    ;         }       } else if (b > 1) {         bfs(bv);         while (par[y] != -1) mark[y] = true, y = par[y], cntA++;         mark[y] = true, cntA++;         if (cntA == n)           cout <<  NO n ;         else {           cout <<  YES n  << n - cntA <<   n ;           for (int i = 1; i <= n; i++)             if (!mark[i]) cout << i <<    ;           cout <<   n ;         }       } else {         fill(h, h + n + 1, 0);         cnt = 0;         for (int i = 1; i <= n; i++)           if (!g[i] && adj[i].size() % 3 == 2) h[i] = 1, cntA = 0, dfs2(i);         if (cnt == n)           cout <<  NO n ;         else if (cnt) {           cout <<  YES n  << n - cnt <<   n ;           for (int i = 1; i <= n; i++)             if (!mark[i]) cout << i <<    ;           cout <<   n ;         } else if (!cnt) {           bool flag = true;           if (b != 1) flag = false;           if (adj[bv].size() < 4) flag = false;           if (flag) {             cntA = 0, flag2 = false, col = 1;             fill(vis, vis + n + 1, false);             fill(h, h + n + 1, 0);             uwu = 0;             for (int i = 1; i <= n; i++) {               if (i != bv && !ca[i]) dfs(i), col++;             }             for (int i = 1; i < col && uwu < 2; i++) {               cntA = 0, flag2 = false, pa.clear();               dfs3(bv, i);             }             cnt = 0;             for (int i = 1; i <= n; i++) {               if (vis[i]) cnt++;             }             if (cnt == n || uwu != 2)               cout <<  NO n ;             else {               cout <<  YES n  << n - cnt <<   n ;               for (int i = 1; i <= n; i++)                 if (!vis[i]) cout << i <<    ;               cout <<   n ;             }           } else             cout <<  NO n ;         }       }       for (int i = 0; i <= n; i++)         adj[i].clear(), h[i] = par[i] = 0, vis[i] = mark[i] = false, ans[i] = 0,                         g[i] = false, ca[i] = 0;       a = b = c = av = bv = cv = 0, cnt = 0, y = 0, flag2 = false, cntA = 0;     }   }