#include #include #include #include #include #include #include #include #include #include using namespace std; #define mp(first, second) make_pair(first, second) typedef unsigned long long ul; typedef long long ll; typedef pair ii; typedef vector vii; typedef vector vi; int n, m; vector graph; vi visited; vi dist; vi previous; void bfs(int start) { visited.assign(n, false); dist.assign(n, INT_MAX); previous.assign(n, -1); queue q; q.push(start); dist[start] = 0; while (!q.empty()) { int curr = q.front(); q.pop(); if (!visited[curr]) { visited[curr] = true; for (int i = 0; i < graph[curr].size(); i++) { int u = graph[curr][i]; if (!visited[u]) { dist[u] = dist[curr] + 1; q.push(u); previous[u] = curr; } } } } } int main() { ios_base::sync_with_stdio(false); ifstream cin("maxpath.in"); ofstream cout("maxpath.out"); cin >> n >> m; graph.resize(n); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; --u; --v; graph[u].push_back(v); graph[v].push_back(u); } int bestDist = INT_MIN; int startNode = -1; vi retrace; for (int i = 0; i < min(n, 1000); i++) { bfs(i); /*cout << "after " << i << endl; for (int i = 0; i < n; i++) { cout << dist[i] << " "; } cout << endl;*/ bool shouldRetrace = false; for (int j = 0; j < n; j++) { if (dist[j] > bestDist) { bestDist = dist[j]; startNode = j; shouldRetrace = true; } } if (shouldRetrace) { retrace.clear(); while (startNode != -1) { retrace.push_back(startNode + 1); startNode = previous[startNode]; } } } cout << retrace.size() << endl; for (int i = 0; i < retrace.size(); i++) { cout << retrace[i] << endl; } //while (true) //{ //} return 0; }