#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=5e+5+50;
bool vis[maxn],f[maxn],flg;
struct Node {
int u,v;
bool operator <(const Node &rhs)const {
return u==rhs.u?v<rhs.v:u<rhs.u;
}
} eg[maxn*2];
struct Edge {
int nxt,to;
} edge[maxn*2];
int hd[maxn],tot;
inline void add(int u,int v) {
edge[++tot].to=v;
edge[tot].nxt=hd[u];
hd[u]=tot;
}
int n,m;
int a[maxn],fa[maxn],cnt;
int tmp=0x3f3f3f3f;
void dfs(int u) {
a[++cnt]=u,vis[u]=true;
for(register int i=hd[u]; i; i=edge[i].nxt) {
int v=edge[i].to;
if(!vis[v])dfs(v);
}
}
void dfs2(int u,int pa) {
if(flg)return ;
if(fa[u]==0)fa[u]=pa;
else if(fa[u]!=pa) {
while(pa!=u)
f[pa]=true,pa=fa[pa];
f[u]=flg=true;
return ;
}
for(register int i=hd[u]; i; i=edge[i].nxt) {
int v=edge[i].to;
if(v!=pa)dfs2(v,u);
}
}
void dfs3(int u) {
a[++cnt]=u,vis[u]=true;
if(f[u]) {
bool flag=false;
for(register int i=hd[u]; i; i=edge[i].nxt) {
if(flg)break;
int v=edge[i].to;
if(!vis[v]&&f[v]) {
i=edge[i].nxt;
while(vis[edge[i].to])i=edge[i].nxt;
if(i) {
tmp=edge[i].to;
} else if(tmp<v)
flag=flg=true;
}
}
for(register int i=hd[u]; i; i=edge[i].nxt) {
int v=edge[i].to;
if(vis[v]||(f[v]&&flag))continue;
dfs3(v);
}
} else for(register int i=hd[u]; i; i=edge[i].nxt) {
int v=edge[i].to;
if(!vis[v])dfs3(v);
}
}
int main() {
scanf("%d%d",&n,&m);
for(register int i=1; i<=m; i++) {
int x,y;
scanf("%d%d",&x,&y);
eg[i*2-1].u=eg[i*2].v=x;
eg[i*2].u=eg[i*2-1].v=y;
}
sort(eg+1,eg+m*2+1);
for(register int i=2*m; i>=1; i--)
add(eg[i].u,eg[i].v);
if(m==n-1) {
dfs(1);
for(register int i=1; i<=n; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
dfs2(1,0);
flg=0;
dfs3(1);
for(register int i=1; i<=n; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}