#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define _sch(u) for(int _ = 0, v = e[u][_], sze = e[u].size(); _ < sze; _++, v = e[u][_])
#define pbk push_back
const int maxn = 5e3 + 5;
int n, m, cut1, cut2, hcen, h1, h2;
bool vis[maxn];
vector<int> e[maxn];
void treedfs(int u, int fa) {
printf("%d ", u);
_sch(u) if(v != fa) treedfs(v, u);
}
void dfs(int u, int fa) {
vis[u] = true;
_sch(u) {
if(vis[v]) {
hcen = v, h2 = u;
return;
}
if(v != fa) dfs(v, u);
if(hcen == u) h1 = v;
if(hcen) return;
}
}
bool del(int u, int fa) {
_sch(u) {
if(v == fa) continue;
if(v == hcen) return true;
if(del(v, u)) {
if(u > h2) cut1 = fa, cut2 = u;
return true;
}
}
return false;
}
int main() {
scanf("%d %d", &n, &m);
for(int i = 1, u, v; i <= m; i++) {
scanf("%d %d", &u, &v);
e[u].pbk(v); e[v].pbk(u);
}
for(int i = 1; i <= n; i++)
sort(e[i].begin(), e[i].end());
if(m == n-1) treedfs(1, 0);
else {
dfs(1, 0);
cut1 = h2, cut2 = hcen;
del(h1, hcen);
int sze = e[cut1].size();
for(int i = 0; i < sze; i++)
if(e[cut1][i] == cut2) {
e[cut1].erase(i + e[cut1].begin());
}
sze = e[cut2].size();
for(int i = 0; i < sze; i++)
if(e[cut2][i] == cut1) {
e[cut2].erase(i + e[cut2].begin());
}
treedfs(1, 0);
}
return 0;
}