#include<bits/stdc++.h>
#define re register int
#define ll long long
#define next net
using namespace std;
const int N=2e6+10;
int t,n,m,tot,top,num,root,gd,out,TOT,col_num,cnt;
int to[N<<1],head[N<<1],next[N<<1],col[N];
int TO[N<<1],HEAD[N<<1],NEXT[N<<1];
int dfn[N],low[N],vis[N],st[N],fa[N][30];
bool ge[N],ge_col[N];
inline int read()
{
char ch=getchar();
int x=0;
while(ch<‘0‘||ch>‘9‘)
ch=getchar();
while(ch>=‘0‘&&ch<=‘9‘)
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x;
}
inline void add(int x,int y)
{
to[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
inline void tarj(int x)
{
dfn[x]=low[x]=++num;
for(re i=head[x];i;i=next[i])
{
int p=to[i];
if(!dfn[p])
{
tarj(p);
low[x]=min(low[x],low[p]);
if(vis[p]==1)
vis[x]=1;
if(low[p]>=dfn[x]&&vis[p]&&x!=1) //注意此处是 vis[p],而不是 vis[x],以为只有从下面回溯回来的才是正确的,或者,这个节点已经被更新过了,不能再次参与计算!!
{
++cnt;
ge[x]=1;
}
}
else
low[x]=min(low[x],dfn[p]);
}
}
inline void in()
{
memset(to,0,sizeof(to));
memset(head,0,sizeof(head));
memset(next,0,sizeof(next));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(ge,0,sizeof(ge));
num=0;
tot=0;
out=0;
cnt=0;
}
int main()
{
t=read();
//cin>>t;
while(t--)
{
in();
n=read();
m=read();
int a,b;
for(re i=1;i<=m;i++)
{
a=read();
b=read();
add(a,b);
add(b,a);
}
vis[n]=1;
tarj(1);
if(!cnt)
{
printf("0\n");
printf("\n");
continue;
}
printf("%d\n",cnt);
for(re i=2;i<n;i++)
if(ge[i])
printf("%d ",i);
printf("\n");
}
return 0;
}