#include using namespace std; const long long N = 2e5 + 7; long long int_rand(){ long long c = (1 << 15); return (rand() % c) * c + (rand() % c); } vector adj[N]; clock_t t; bool time_left(){ if((float) (clock() - t) / CLOCKS_PER_SEC <= 4.6) return true; return false; } bool used[N]; long long parent[N], cnt[N]; long long n; vector dfs_vector; long long d[N]; void dfs(long long from){ stack st; queue q; st.push(from); used[from] = true; d[from] = 1; long long from2 = from, best = from; //cout << "\n"; while(!st.empty()){ from = st.top(); st.pop(); if(d[from] > d[best]) best = from; for(long long i = cnt[from]; i < adj[from].size(); i++){ long long x = adj[from][i]; if(!used[x]){ used[x] = true; parent[x] = from; d[x] = d[from] + 1; st.push(from); cnt[from]++; st.push(x); break; } } } from = best; while(from != from2) { dfs_vector.push_back(from); from = parent[from]; } dfs_vector.push_back(from); //cin.get(); //cout << from << " " << dfs_vector.size() << "\n"; } void solve(long long x){ //cout << x << "\n"; for(long long i = 1; i <= n; i++){ used[i] = false; cnt[i] = 0; } dfs_vector.clear(); dfs(x); for(long long i = 1; i <= n; i++){ used[i] = false; cnt[i] = 0; } for(long long i: dfs_vector){ used[i] = true; } dfs_vector.pop_back(); vector curr = dfs_vector; dfs_vector.clear(); dfs(x); reverse(dfs_vector.begin(), dfs_vector.end()); for(int y: dfs_vector){ curr.push_back(y); } dfs_vector = curr; } long long calc_score(vector v){ long long score = 0; for(int i = 0; i < v.size(); i++) score += v[i] * (i + 1); return score; } vector res, curr; long long res_score, curr_score; vector try_reverse(vector v){ std::vector rev; rev = v; reverse(rev.begin(), rev.end()); if(calc_score(rev) > calc_score(v)) return rev; return v; } long double C; bool cmp(long long lvalue, long long rvalue){ return (long double)lvalue - C*(long double)adj[lvalue].size() > (long double)rvalue - C*(long long)adj[rvalue].size(); } int main (){ ios::sync_with_stdio(false); cin.tie(NULL); t = clock(); freopen("maxpath.in", "r", stdin); freopen("maxpath.out", "w", stdout); long long m; cin >> n >> m; if(n <= 100) C = -2; else if(n == 1000) C = 5; else C = 15000; for(long long i = 0; i < m; i++){ long long u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for(int i = 1; i <= n; i++){ sort(adj[i].begin(), adj[i].end(), cmp); } solve(n); //res = try_reverse(dfs_vector); res_score = calc_score(res); do{ long long x = n + 1; while(time_left() && x > 1){ x--; solve(x); //dfs_vector = try_reverse(dfs_vector); curr_score = calc_score(dfs_vector); if(curr_score > res_score){ res_score = curr_score; res = dfs_vector; } if(n == 100000){ C -= 100; } } if(n <= 100){ C += 0.1; } else{ C = rand() % n + 1; } if(!time_left()){ break; } for(int i = 1; i <= n; i++){ sort(adj[i].begin(), adj[i].end(), cmp); } } while(true); //cout << res_score << endl; cout << res.size() << "\n"; for(int x: res){ cout << x << "\n"; } return 0; } /* 6 10 3 4 3 2 3 5 4 6 4 2 2 5 2 1 1 6 2 6 5 1 */