Code:
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<algorithm>
#include<vector>
using namespace std;
void setIO(string a){
freopen((a+".in").c_str(),"r",stdin);
freopen((a+".out").c_str(),"w",stdout);
}
const int maxn = 5009;
int low[maxn], pre[maxn], idx[maxn], A[maxn], B[maxn], ab;
bool is[maxn][maxn];
vector<int>G[maxn], idxx[maxn];
stack<int>S;
int n,m,scc, num;
void addedge(int u,int v){ G[u].push_back(v); }
void tarjan(int u,int fa){
low[u]=pre[u]=++scc;
S.push(u);
for(int i=0;i<G[u].size();++i){
if(G[u][i]==fa) continue;
if(!pre[G[u][i]]) {
tarjan(G[u][i],u);
low[u]=min(low[u],low[G[u][i]]);
}
else if(!idx[G[u][i]]) low[u]=min(low[u],pre[G[u][i]]);
}
if(low[u]==pre[u])
{
++num;
for(;;){
int g=S.top();S.pop();
idxx[num].push_back(g);
idx[g]=num;
if(g==u) break;
}
}
}
int tag[maxn], arr[maxn][maxn], p, current;
void dfs(int u){
arr[current][++p]=u;
tag[u]=1;
int siz=G[u].size();
for(int i=0;i<siz;++i){
if(tag[G[u][i]] || is[u][G[u][i]]) continue;
dfs(G[u][i]);
}
}
int main(){
//setIO("travel");
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int a,b;
scanf("%d%d",&a,&b);
addedge(a,b);
addedge(b,a);
}
for(int i=1;i<=n;++i){
int siz=G[i].size();
sort(G[i].begin(),G[i].end());
}
tarjan(1,0);
for(int i=1;i<=num;++i){
if(idxx[i].size()>1) {
int siz=idxx[i].size();
for(int j=0;j<siz;++j)
for(int k=j+1;k<siz;++k) A[++ab]=idxx[i][j],B[ab]=idxx[i][k];
break;
}
}
if(ab==0) { dfs(1); for(int i=1;i<=n;++i) printf("%d ",arr[0][i]); return 0;}
for(int i=1;i<=ab;++i){
p=0;
++current;
memset(tag,0,sizeof(tag));
is[A[i]][B[i]]=is[B[i]][A[i]]=1;
dfs(1);
is[A[i]][B[i]]=is[B[i]][A[i]]=0;
}
int cur_best=1;
for(int i=2;i<=current;++i){
for(int j=1;j<=n;++j) if(arr[cur_best][j]!=arr[i][j]){
if(arr[cur_best][j]>arr[i][j]) cur_best=i;
break;
}
}
for(int i=1;i<=n;++i) printf("%d ",arr[cur_best][i]);
printf("\n");
return 0;
}