RT
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+10;
const int MAXM = MAXN << 1;
int n, m;
struct Node {
int u, v, next;
} edge[MAXM];
int head[MAXM], cnt;
bool vis[MAXN];
int pre[MAXN];
int newpos[MAXN];
int now, ans;
void add(int u, int v) {
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void adde(int u, int v) {
add(u, v);
add(v, u);
}
void DFS(int u) {
newpos[now++] = u;
for(int i = head[u]; ~i; i = edge[i].next) {//按位非
int v = edge[i].v;
if(vis[v]) {
continue;
}
vis[v] = true;
pre[v] = u;
DFS(v);
}
}
bool cover[MAXN], res[MAXN];
void MDS() {
for(int i = 0; i <= m; i++) {
cover[i] = 0;
res[i] = 0;
}
for(int i = n - 1; i >= 0; i--) {
int t = newpos[i];
if(cover[t]) {
continue;
}
if(!res[pre[t]]) {
res[pre[t]] = true;
ans++;
}
cover[t] = true;
cover[pre[t]] = true;
cover[pre[pre[t]]] = true;
}
int cnt = 0;
printf("%d\n", ans);
for(int i = 1; i <= n; i++) {
if(res[i]) {
cnt++;
printf("%d ",i);
}
}
printf("\n");
}
void init() {
cnt = 0;
for(int i = 0; i <= m; i++) {
head[i] = -1;
vis[i] = 0;
pre[i] = 0;
newpos[i] = 0;
}
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
init();
scanf("%d%d", &n, &m);
int u, v;
for(int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
adde(u, v);
}
ans = 0;
now = 0;
vis[1] = true;
pre[1] = 1;
DFS(1);
MDS();
}
return 0;
}