#include using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define trav(a, x) for(auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vl; const ll MAXN = 300001; int n, m; set edges; vector C(MAXN, vi()); int color(ll i, ll j){ if(edges.find(i*MAXN+j) == edges.end())return 1; return 0; } bool mark[MAXN] = {0}; set S; vi ans; int grab(int i, int c){ if(c == 0){ trav(y, C[i]){ if(!mark[y])return y; } return -1; } if(S.empty())return -1; auto it = S.end(); it--; int j = 0; while(1){ if(color(i, (*it)) == 1 && !mark[(*it)] && (*it) != i)return (*it); if(it == S.begin())return -1; it--; j++; if(j > max(20, 3*sz(C[i])))return -1; } return -1; } bool greedy(int i, int c, bool change){ while(1){ if(sz(S) == 1){ ans.push_back(i); return 1; } int x = grab(i, c); if(x == -1){ if(change){ x = grab(i, c^1); change = 0; c ^= 1; } } if(x == -1)return 0; S.erase(i); mark[i] = 1; ans.push_back(i); i = x; } // return greedy(x, c, change); } bool solve(int c){ ans.clear(); rep(c1,0,n){ mark[c1] = 0; S.insert(c1); random_shuffle(all(C[c1])); } return greedy(0, c, 1); } int main() { cin >> n >> m; rep(c1,0,m){ ll a,b; cin >> a >> b; a--; b--; edges.insert(a*MAXN+b); edges.insert(b*MAXN+a); C[a].push_back(b); C[b].push_back(a); } bool test; rep(c1,0,20){ test = solve(c1%2); if(test)break; } if(!test){ cout << "error\n"; return 0; } rep(c1,0,n){ cout << ans[c1]+1 << " "; }cout << "\n"; return 0; }