#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
vector<int> Edge[N];
int n, m;
namespace solve1{
int fa[N], isring[N], tmp = -1, cuttena = -1, cuttenb = -1;
int gf(int x){ return fa[x] == x ? x : fa[x] = gf(fa[x]); }
void cut(int x, int y){ cuttena = x, cuttenb = y; }
bool getring(int x, int f, int g){
if(x == g) return isring[x] = isring[g] = 1;
for(int i = 0; i < Edge[x].size(); ++ i){
int y = Edge[x][i]; if(y == f) continue;
if(getring(y, x, g)) return isring[x] = 1;
}
return false;
}
void dfs(int x, int f){
if(x == cuttena && f == cuttenb) return;
if(x == cuttenb && f == cuttena) return;
if(x) printf("%d ", x);
if(isring[x]){
if(tmp == -1){
int a = -1;
for(int i = 0; i < Edge[x].size(); ++ i){
int y = Edge[x][i]; if(y == f) continue;
if(isring[y] && a == -1) a = y;
else if(isring[y]) tmp = y;
}
for(int i = 0; i < Edge[x].size(); ++ i){
int y = Edge[x][i]; if(y == f) continue;
dfs(y, x);
}
} else {
for(int i = 0; i < Edge[x].size(); ++ i){
int y = Edge[x][i]; if(y == f) continue;
if(!isring[y] || (isring[y] && y < tmp)) dfs(y, x);
else cut(x, y), tmp = 0x3f3f3f3f;
}
}
} else {
for(int i = 0; i < Edge[x].size(); ++ i){
int y = Edge[x][i]; if(y == f) continue;
dfs(y, x);
}
}
}
void mian(){
for(int i = 1; i <= n; ++ i) fa[i] = i;
for(int i = 1, u, v, flg = 1; i <= m; ++ i){
scanf("%d%d", &u, &v);
Edge[u].push_back(v);
Edge[v].push_back(u);
if(gf(u) == gf(v)) getring(u, -1, v), flg = 0;
if(flg) fa[gf(u)] = gf(v);
}
for(int i = 1; i <= n; ++ i)
sort(Edge[i].begin(), Edge[i].end());
dfs(1, -1);
}
}
namespace solve2{
void dfs(int x, int f){
printf("%d ", x);
for(int i = 0; i < Edge[x].size(); ++ i){
int y = Edge[x][i]; if(y == f) continue;
dfs(y, x);
}
}
void mian(){
for(int i = 1, u, v; i <= m; ++ i){
scanf("%d%d", &u, &v);
Edge[u].push_back(v);
Edge[v].push_back(u);
}
for(int i = 1; i <= n; ++ i)
sort(Edge[i].begin(), Edge[i].end());
dfs(1, -1);
}
}
int main(){
scanf("%d%d", &n, &m);
if(n == m) solve1::mian();
else solve2::mian();
return 0;
}