#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
il int read()
{
int s=0,w=1;char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') w=-1;c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<1)+(s<<3)+c-'0';c=getchar();
}return s*w;
}
const int N=5e5+10;
const int MAX=1e9;
int n,m,ans[N],cnt;
int R[N],dfn[N],timer,temp=MAX,tag=0;
bool vis[N];
vector<int> vec[N];
struct node{
int u,v;
}e[N<<1];
/*
R:rings
temp:记录如果需要回溯那将去哪里
tag表示是否回溯过
*/
il bool cmp(node c,node d){ return c.v<d.v; }
il int dfs_pre(int x,int fa)//判断有没有环
{
dfn[x]=++timer;int sz=vec[x].size();
for(re int i=0;i<sz;i++){
int vv=vec[x][i];
if(vv==fa) continue;
if(dfn[vv]){
R[x]=1;return dfn[vv];
}
int tmp=dfs_pre(vv,x);
if(tmp>0 && dfn[x]>=tmp){
R[x]=1;return tmp;
}
}
return 0;
}
il void dfs(int x)
{
ans[++cnt]=x;
vis[x]=1;
int pre=temp;
int sz=vec[x].size();
for(re int i=0;i<sz;i++){
if(vis[vec[x][i] ]) continue;
int p=i+1,vv=vec[x][i];
while(p<sz && vis[vec[x][p]]) p++;
if(p>=sz && R[x] && R[vv] && (!tag)){
tag=1;return;
}
temp=(p<sz)?vec[x][p]:pre;
dfs(vv);
temp=pre;
}
}
int main()
{
//freopen("P5049_17.in","r",stdin);
//freopen("LZ.out","w",stdout);
n=read(),m=read();
for(re int i=1;i<=m;i++){
e[i].u=read(),e[i].v=read();
e[i+m].v=e[i].u,e[i+m].u=e[i].v;
}
sort(e+1,e+1+(m<<1),cmp);
for(re int i=1;i<=(m<<1);i++) vec[e[i].u].push_back(e[i].v);
dfs_pre(1,0);//printf("qwq\n");
dfs(1);
for(re int i=1;i<=n;i++) printf("%d ",ans[i]);
}
球求大佬康一眼蒟蒻的码吧,谢谢您 参照 @duoluoluo 的题解写的