rt
TLE #20,#21, #22, #23, #24, #25
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 500010;
int n, m;
vector<int>g[N];
PII edge[N];
int ans[N], path[N];
int cnt, state;
int du, dv;
bool st[N];
bool dfs(int u){
path[cnt ++ ] = u;
st[u] = true;
if(!state){
if(path[cnt - 1] < ans[cnt - 1]) state = -1;
else if(path[cnt - 1] > ans[cnt - 1]){ state = 1; return true;}
}
for(auto x: g[u]){
if(x == du & u == dv || x == dv && u == du)continue;
if(!st[x] && dfs(x))return true;
}
return false;
}
int main(){
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i ++ ){
int a, b;
scanf("%d%d", &a, &b);
edge[i] = {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());
}
memset(ans, 0x3f, sizeof ans);
if(n == m){
for (int i = 0; i < m; i ++ ){
du = edge[i].x, dv = edge[i].y;
memset(st, 0, sizeof st);
cnt = state = 0;
dfs(1);
if(cnt == n && state < 0){
memcpy(ans, path, sizeof ans);
}
}
}else{
dfs(1);
memcpy(ans, path, sizeof ans);
}
for (int i = 0; i < n; i ++ ){
printf("%d ", ans[i]);
}
return 0;
}