#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct vv{
    int from,to;
};
int vis[N];//不能走到重复点.
vector<int>v[N];
vector<vv>ans;
int deg[N];//度

queue<int>q;

void bfs()
{
    while(q.size())
    {
        int temp=q.front();
        vis[temp]=1;
        q.pop();
        for(int i=0;i<v[temp].size();i++)
        {
            int x=v[temp][i];
            if(vis[x])  continue;
            vis[x]=1;
            ans.push_back({temp,x});
            q.push(x);
        }
    }
}

int main()
{
    int n,m,mx1=0,mx2=0;//mx1记录最大度数 mx2记录最大度数所在的点.
    scanf("%d%d",&n,&m);//点数 边数
    for(int i=0;i<m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
        deg[x]++;deg[y]++;
        if(deg[x]>mx1) {mx2=x;mx1=deg[x];}
        if(deg[y]>mx1) {mx2=y;mx1=deg[y];}
    }
    //找到了度数最大的点,然后进行删边.
    q.push(mx2);
    bfs();
    for(int i=0;i<ans.size();i++)
    {
        printf("%d %d\n",ans[i].from,ans[i].to);
    }
    return 0;
}

2333我感觉我应该学图论,感觉自己图论越来越好了,虽然也是个水题Hhhh
统计下度数最大的点作为顶点然后bfs成树即可.