#include <bits/stdc++.h>
using namespace std;
int n, m;
int par[500005];
int comp[500005];
bool vis[500005];
set<int> vd[3];
set<int> hold;
vector<int> adj[500005];
inline void give_answer() {
  if (hold.empty() || hold.size() == n) {
    puts("No");
    return;
  }
  puts("Yes");
  assert((n - hold.size()) > 1);
  printf("%d\n", n - hold.size());
  for (int i = 1; i <= n; i++) {
    if (hold.count(i)) {
      continue;
    }
    printf("%d ", i);
  }
  puts("");
}
bool dfs1(int st, int pr) {
  par[st] = pr;
  comp[st] = comp[pr];
  bool found = false;
  for (auto x : adj[st]) {
    if (x == pr || vd[1].count(x)) {
      continue;
    }
    if (par[x]) {
      found = true;
      sort(adj[st].begin(), adj[st].end());
      break;
    }
  }
  if (found) {
    int curr = st;
    while (curr == pr || !binary_search(adj[st].begin(), adj[st].end(), curr)) {
      hold.insert(curr);
      curr = par[curr];
    }
    hold.insert(curr);
    return true;
  }
  bool done = false;
  for (auto x : adj[st]) {
    if (x == pr || vd[1].count(x)) {
      continue;
    }
    done = dfs1(x, st);
    if (done) {
      return true;
    }
  }
  return false;
}
void bfs1(int st) {
  vector<int> par(n + 1, 0);
  queue<int> q;
  q.push(st);
  vis[st] = true;
  int v = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (u != st && vd[1].count(u)) {
      v = u;
      break;
    }
    for (auto x : adj[u]) {
      if (vis[x]) {
        continue;
      }
      par[x] = u;
      vis[x] = true;
      q.push(x);
    }
  }
  assert(v != 0);
  if (v == 0) {
    exit(-1);
  }
  while (v) {
    hold.insert(v);
    v = par[v];
  }
  assert(hold.count(st));
  return;
}
void find_cycles(int c1, int c2, int st, int vc1, int vc2) {
  queue<int> q;
  vector<int> par(n + 1, 0);
  set<int> tars;
  for (auto x : adj[st]) {
    if (x == vc1 || x == vc2) {
      continue;
    }
    tars.insert(x);
  }
  par[vc1] = -1;
  q.push(vc1);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    if (tars.count(v)) {
      while (v != -1) {
        hold.insert(v);
        v = par[v];
      }
      break;
    }
    for (auto u : adj[v]) {
      if (comp[u] != comp[v] || par[u]) {
        continue;
      }
      par[u] = v;
      q.push(u);
    }
  }
  while (!q.empty()) {
    q.pop();
  }
  fill(par.begin(), par.end(), 0);
  par[vc2] = -1;
  q.push(vc2);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    if (tars.count(v)) {
      while (v != -1) {
        hold.insert(v);
        v = par[v];
      }
      break;
    }
    for (auto u : adj[v]) {
      if (comp[u] != comp[v] || par[u]) {
        continue;
      }
      par[u] = v;
      q.push(u);
    }
  }
  hold.insert(st);
}
int main() {
  for (int _t_, _q_ = 0, __ = scanf("%d", &_t_); _q_ < _t_; _q_++) {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      adj[a].push_back(b);
      adj[b].push_back(a);
    }
    for (int i = 1; i <= n; i++) {
      vd[adj[i].size() % 3].insert(i);
    }
    if (vd[0].size()) {
      hold.insert(*vd[0].begin());
      give_answer();
      goto CLEANUP;
    }
    for (auto v : vd[1]) {
      for (auto u : adj[v]) {
        if (!vd[1].count(u)) {
          continue;
        }
        hold.insert(u);
        hold.insert(v);
        give_answer();
        goto CLEANUP;
      }
    }
    for (auto v : vd[2]) {
      if (comp[v]) {
        continue;
      }
      comp[v] = v;
      if (dfs1(v, v)) {
        give_answer();
        goto CLEANUP;
      }
    }
    if (vd[1].size() > 1) {
      bfs1(*vd[1].begin());
      give_answer();
      goto CLEANUP;
    }
    for (auto v : vd[1]) {
      int cmp = comp[adj[v][0]];
      for (auto u : adj[v]) {
        if (comp[u] != cmp) {
          find_cycles(cmp, comp[u], v, adj[v][0], u);
          give_answer();
          goto CLEANUP;
        }
      }
    }
    give_answer();
  CLEANUP:
    for (int i = 0; i < 3; i++) {
      vd[i].clear();
    }
    hold.clear();
    for (int i = 1; i <= n; i++) {
      adj[i].clear();
    }
    memset(vis, 0, (n + 1) * sizeof(vis[0]));
    memset(par, 0, (n + 1) * sizeof(par[0]));
    memset(comp, 0, (n + 1) * sizeof(comp[0]));
  }
  return 0;
}
