#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
const int N=1e5;
const int maxn=1e7+10;
int n,m;
int head[N],ver[N],nxt[N],fa[N];
int dfns[N],loop[N];
int tot,cnt,num;
void get_loop(int u){
dfns[u]=++cnt; //找出每个结点的遍历顺序
for(int i=head[u];i;i=nxt[i]){
int v=ver[i];
if(v==fa[u]) continue; //排除父结点
if(dfns[v]){ //观察这个点之前是否遍历过
if(dfns[v]<dfns[u]) continue; //子节点在更前面先遍历
//某个结点的子节点
loop[++num]=v;
for(;v!=u;v=fa[v]){
loop[++num]=fa[v];
}
}else{
fa[v]=u,get_loop(v);
}
}
}
void add(int x,int y){
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int main(){
cin>>n>>m;
while(m--){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
get_loop(1);
for(int i=1;i<=num;i++){
cout<<loop[i]<<" ";
}
return 0;
}