#include<stdio.h>
int main()
{
int i,j,n,m,a,b,cur,book[101]= {
0},e[101][101];
int que[10001],head,tail;
scanf("%d %d",&n,&m); //初始化二维矩阵
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(i==j)
e[i][j] = 0;
else
e[i][j] = 99999999; //假设为正无穷
for(i=1;i<=m;i++) //读入顶点之间的边
{
scanf("%d %d",&a,&b);
e[a][b] = 1;
e[b][a] = 1; //无向图
}
head = 1; //队列初始化
tail = 1;
que[tail] = 1; //从1号顶点出发,将1号顶点加入队列
tail++;
book[1] = 1; //标记1号顶点已1访问
while(head<tail) //当队列不为空的时候循环
{
cur = que[head]; //当前正在访问的顶点编号
for(i=1;i<=n;i++) //从1~n依次尝试
{
if(e[cur][i]==1 && book[i]==0)
{
que[tail] = i; //如果从顶点cur的顶点i有边,并且顶点i没有被访问,则将顶点i入队
tail ++;
book[i] = 1; //标记顶点i已访问
}
if(tail>n) //如果tail大于n, 则表明所有顶点都已经被访问过
{
break;
}
}
head++; //当一个顶点扩展后,head++,然后才能继续往下扩展
}
for(i=1;i<tail;i++)
printf("%d ",que[i]);
getchar();getchar();
return 0;
}