#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 500000
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
using namespace std;
int n,m,d,ee,x[N+5],y[N+5],s[N+5],lnk[N+5],deg[N+5],vis[N+5],fa[N+5],tag[N+5];
struct edge {int to,nxt;}e[2*N+5];
struct data {int v;I bool operator < (Con data& o) Con {return fa[v]<fa[o.v];}}p[N+5];
class FastIO
{
	private:
		#define FS 100000
		#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
		#define pc(c) (C==E&&(clear(),0),*C++=c)
		#define tn (x<<3)+(x<<1)
		#define D isdigit(c=tc())
		int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
	public:
		I FastIO() {A=B=FI,C=FO,E=FO+FS;}
		Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
		Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
		Tp I void write(Con Ty& x,Con char& y) {write(x),pc(y);}
		I void writes(Con string& x) {for(RI i=0,y=x.length();i^y;++i) pc(x[i]);}
		I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
}F;
I int getfa(CI x) {return fa[x]^x?fa[x]=getfa(fa[x]):x;}
I bool dfs(CI x,CI y)//保留x到y路径上的点 
{
	if(x==y) return s[y]=1;vis[x]=1;
	for(RI i=lnk[x];i;i=e[i].nxt) if(!vis[e[i].to]&&dfs(e[i].to,y)) return s[x]=1;
	return vis[x]=0;
}
I bool Work(CI x,CI st)//有两个度数为1的点，找出一条链
{
	if(deg[x]%3==1&&x^st) return s[x]=1;vis[x]=1;
	for(RI i=lnk[x];i;i=e[i].nxt) if(!vis[e[i].to]&&Work(e[i].to,st)) return s[x]=1;
	return vis[x]=0;
}
I int Travel(CI x,CI lst=0)//在以x为根的树上找出一条合法路径 
{
	RI i,f,g=tag[x]?x:0;for(i=lnk[x];i;i=e[i].nxt) if(e[i].to^lst)
		{if(!~(f=Travel(e[i].to,x))) return -1;if(f&&g) return dfs(f,g),-1;f&&(g=f);}return g;
}
int main()
{
	RI Tt,i,j,t1,t2;F.read(Tt);W(Tt--)
	{
		for(F.read(n),F.read(m),d=ee=0,i=1;i<=n;++i) s[i]=lnk[i]=deg[i]=vis[i]=tag[i]=0,fa[i]=i;//清空 
		for(i=1;i<=m;++i) F.read(x[i]),F.read(y[i]),++deg[x[i]],++deg[y[i]];//读入边，计算点数 
		if(n==1) {F.writes("No\n");continue;}//只有一个点，无解 
		for(i=1;i<=n;++i) if(!(deg[i]%3)) {s[i]=1;goto End;}//存在度数模3余0的点，保留该点 
		if(n==2) {F.writes("No\n");continue;}//只有两个点，无解
		for(i=1;i<=m;++i) if(deg[x[i]]%3==1&&deg[y[i]]%3==1) {s[x[i]]=s[y[i]]=1;goto End;}//有两个度数模3余1的点连边，保留这对点 
		for(t2=0,i=1;i<=n;++i) deg[i]==2&&++t2;if(t2==n) {F.writes("No\n");continue;}//整张图是一个环，无解 
		for(i=1;i<=m;++i) if(deg[x[i]]%3==2&&deg[y[i]]%3==2)//给度数模3余2的点连边 
		{
			if(getfa(x[i])==getfa(y[i])) {dfs(x[i],y[i]);goto End;}//模3余2的点之间存在环，保留这个环 
			fa[getfa(x[i])]=getfa(y[i]),add(x[i],y[i]),add(y[i],x[i]);//并查集上连边
		}
		for(t1=t2=0,i=1;i<=n;++i) deg[i]==1&&++t1,deg[i]==2&&++t2;
		if(t1==2&&t2==n-2) {F.writes("No\n");continue;}//整张图是一条链，无解
		if(t1>1)//有两个度数为1的点，找出一条链
		{
			for(i=1;i<=m;++i) add(x[i],y[i]),add(y[i],x[i]);//连边 
			for(t1=0,i=1;i<=n;++i) if(deg[i]%3==1) {Work(i,i);goto End;}//搜索出一条路径 
		} 
		for(t1=t2=0,i=1;i<=n;++i) deg[i]%3==1&&(t1=i),deg[i]==2&&++t2;
		if(deg[t1]==4&&t2==n-1) {F.writes("No\n");continue;}//整张图是两个相连的环，无解
		for(s[t1]=1,t2=0,i=1;i<=m;++i) x[i]==t1&&(tag[p[++t2].v=y[i]]=1),y[i]==t1&&(tag[p[++t2].v=x[i]]=1);//记下与度数模3余1的点相连的点 
		for(t1=0,sort(p+1,p+t2+1),i=1;i<t2;++i) if(getfa(p[i].v)==getfa(p[i+1].v))
			if(Travel(fa[p[i].v]),!t1) {++t1;W(i<t2&&getfa(p[i].v)==getfa(p[i+1].v)) ++i;}else goto End;//从两棵树中找边 
		End:for(t1=0,i=1;i<=n;++i) !s[i]&&++t1;F.writes("Yes\n"),F.write(t1,'\n');//统计删去的点数 
		for(i=1;i<=n;++i) !s[i]&&(F.write(i,' '),0);F.writes("\n");//输出删去的点 
	}return F.clear(),0;
}