/* DEATH-MATCH Davit-Marg */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mod 1000000007ll #define LL long long #define LD long double #define MP make_pair #define PB push_back using namespace std; ifstream fin("maxpath.in"); ofstream fout("maxpath.out"); int n, m, used[500005]; vector g[500005]; vector v, best, a; LL sum, bsum; void dfs(LL k, LL d = 1) { used[k] = 1; sum += d * k; v.PB(k); random_shuffle(g[k].begin(), g[k].end()); for (int i = 0; i < g[k].size(); i++) { int to = g[k][i]; if (used[to]) continue; dfs(to, d + 1); } if (sum > bsum) { bsum = sum; best = v; } sum -= d * k; v.pop_back(); } void bfs(int k, int st = 1) { used[k] = 1; //random_shuffle(g[k].begin(), g[k].end()); vector a[2]; queue> q; q.push(MP(g[k][0], 0)); q.push(MP(g[k][1], 1)); while (!q.empty()) { pair now = q.front(); q.pop(); if (used[now.first]) continue; a[now.second].PB(now.first); used[now.first] = 1; for (int i = 0; i < g[now.first].size(); i++) { int to = g[now.first][i]; if (used[to]) continue; q.push(MP(to, now.second)); break; } } reverse(a[0].begin(), a[0].end()); for (int i = 0; i < a[0].size(); i++) { v.PB(a[0][i]); sum += (LL)v.size()*(LL)v.back(); } v.PB(k); sum += (LL)v.size()*(LL)v.back(); for (int i = 0; i < a[1].size(); i++) { v.PB(a[1][i]); sum += (LL)v.size()*(LL)v.back(); } if (sum > bsum) { bsum = sum; best = v; } sum = 0; v.resize(0); } int main() { fin >> n >> m; bsum = n; best.PB(n); for (int i = 0; i < m; i++) { int a, b; fin >> a >> b; g[a].PB(b); g[b].PB(a); } if (n <= 1000) { m += n; m /= 2; if (m == 0) m++; for (int i = 1; i <= n && a.size()<200; i++) if (g[i].size() == 1) a.PB(i); while ((int)a.size() < 20000000 / m) a.PB(n - (rand() % (n / 6))); while ((int)a.size() < 25000000 / m) a.PB(rand() % n + 1); random_shuffle(a.begin(), a.end()); for (int i = 0; i < min((int)a.size(), 25000000 / m); i++) { memset(used, 0, (n + 2) * sizeof(int)); if (g[a[i]].size() == 1 || n <= 1000) dfs(a[i]); else if (g[a[i]].size() >= 2) bfs(a[i], 1); } fout << best.size() << endl; for (int i = 0; i < best.size(); i++) fout << best[i] << " "; fout << endl; return 0; } for (int i = 1; i <= n; i++) if (g[i].size() == 1) a.PB(i); while ((int)a.size() < 20000000 / (m + n)) a.PB(n - (rand() % (n / 6))); while ((int)a.size() < 25000000 / (m + n)) a.PB(rand() % n + 1); random_shuffle(a.begin(), a.end()); for (int i = 0; i < min((int)a.size(), 25000000 / (m + n)); i++) { memset(used, 0, (n + 2) * sizeof(int)); if (g[a[i]].size() == 1 || n <= 1000) dfs(a[i]); else if (g[a[i]].size() >= 2) bfs(a[i], 1); } fout << best.size() << endl; for (int i = 0; i < best.size(); i++) fout << best[i] << " "; fout << endl; return 0; } /* 5 3 4 5 5 1 1 4 5 5 1 2 2 3 2 5 2 4 3 5 */