#include <bits/stdc++.h>
using namespace std;
int n,m,ta,tb;
vector <int> g[5001];
bool vis[5001];
int head[5001],ans[5001],now[5001],cnt;
struct Egde {
int v,nxt;
} e[10005];
void addEdge(int u,int v) {
e[++cnt].v = v;
e[cnt].nxt = head[u];
head[u] = cnt;
return;
}
void dfs(int x) {
now[++cnt] = x;
vis[x] = 1;
for(int i = head[x]; i != -1; i = e[i].nxt) {
if(n == m && ((x == ta && e[i].v == tb) || (x == tb && e[i].v == ta))) continue;
if(!vis[e[i].v]) dfs(e[i].v);
}
return;
}
int main() {
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i = 0; i < m; i++) {
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
for(int i = 1; i <= n; i++) {
sort(g[i].begin(),g[i].end());
reverse(g[i].begin(),g[i].end());
for(int j = 0; j < g[i].size(); j++) {
addEdge(i,g[i][j]);
}
}
cnt = 0;
if(m == n - 1) {
dfs(1);
for(int i = 1; i <= n; i++) printf("%d ",now[i]);
return 0;
}
ans[1] = 2;
for(int i = 1; i <= n; i++) {
for(int j = head[i]; j != -1; j = e[j].nxt) {
ta = i,tb = e[j].v;
if(ta > tb) continue;
cnt = 0;
memset(vis,0,sizeof(vis));
dfs(1);
if(cnt == n) {
bool flag = false;
for(int k = 1; k <= n; k++) {
if(ans[k] < now[k]) break;
else if(ans[k] > now[k]) {
flag = true;
break;
}
}
if(flag) {
for(int k = 1; k <= n; k++) ans[k] = now[k];
}
}
}
}
for(int i = 1; i <= n; i++) printf("%d",ans[i]);
return 0;
}