手动造递归
#include<iostream>
#include<vector>
using namespace std;
int n,m,cnt;
vector<int> re;
char arc[10001][10001];
char ar[10001][10001];
int v[10001];
vector<int> all[10001];
vector<int> rr;
int vis[10001];
void dfs(int a)
{
for(int t=0;t<all[a].size();++t){
int i=all[a][t];
if(!vis[i]&&ar[a][i]){
vis[i]=1;
++cnt;
dfs(i);
}
}
}
int main(){
cin>>n>>m;
int a,b;
for(int i=0;i<m;++i){
cin>>a>>b;
arc[a][b]=arc[b][a]=1;
ar[a][b]=ar[b][a]=1;
v[a]++;v[b]++;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(arc[i][j]) all[i].push_back(j);
a=b=0;
for(int i=1;i<=n;++i){
if(v[i]&1){
if(!a) a=i;
else if(!b) b=i;
else {cout<<-1<<endl;return 0;}
}
if(!v[i]) {cout<<-1<<endl;return 0;}
}
if(a&!b) {cout<<-1<<endl;return 0;}
cnt=1;
vis[1]=1;
dfs(1);
if(cnt!=n){cout<<-1<<endl;return 0;}
if(!a) a=1;
re.push_back(a);
int f=0;
while(!re.empty()){
f=0;
for(int t=0;t<all[a].size();++t){
int i=all[a][t];
if(arc[a][i]){
re.push_back(i);
arc[a][i]=arc[i][a]=0;
a=i;
f=1;
break;
}
}
if(!f){
int e=re.back();
re.pop_back();
a=re.back();
rr.push_back(e);
}
}
cout<<rr.back();
for(int i=m-1;i>=0;--i)
cout<<" "<<rr[i];
cout<<endl;
}