#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int Max_n=1001;
vector<int>G[Max_n];
int use[Max_n];
void dfs(int v){
printf("%d ",v);//输出当前遍历的结点
use[v]=1;//标记
while(!G[v].empty()){//该结点有邻接点
int v1=G[v].back();//从邻接表中取出
G[v].pop_back();// 删除
if(!use[v1])//取出的结点是否使用过
dfs(v1);//未使用过继续向下递归
}
}
int main(){
int v,e;
scanf("%d%d",&v,&e);
memset(use,0,sizeof(use));
for(int i=1;i<=e;i++){
int from,to;
scanf("%d%d",&from,&to);
G[from].push_back(to);//建立邻接表
G[to].push_back(from);
}
dfs(1);
return 0;
}
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int Max_n=1001;
vector<int>G[Max_n];
int use[Max_n];
queue<int>q;
void bfs(int v){
printf("%d ",v);//输出当前遍历的顶点
use[v]=1; //标记
q.push(v);//放队列中
while(!q.empty()){//如果队列不为空
int v1=q.front();//取队头元素
while(!G[v1].empty()){//邻接表里面有元素
if(!use[G[v1].back()]){//看是否遍历过
printf("%d ",G[v1].back());//没有遍历过就遍历
use[G[v1].back()]=1;//标记
q.push(G[v1].back());//入队
}
G[v1].pop_back();//从邻接表中删除已经遍历过的结点
}
q.pop();队头元素出队
}
}
int main(){
int v,e;
scanf("%d%d",&v,&e);
for(int i=1;i<=e;i++){
int from,to;
scanf("%d%d",&from,&to);
G[from].push_back(to);
G[to].push_back(from);
}
bfs(1);
return 0;
}