| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| int n, m; |
| vector<vector<int>> g, rg; |
| vector<int> seen; |
| int timer_cnt = 1; |
|
|
| vector<int> buildPathFrom(int start, bool forwardFirst) { |
| ++timer_cnt; |
| deque<int> dq; |
| dq.push_back(start); |
| seen[start] = timer_cnt; |
|
|
| if (forwardFirst) { |
| |
| int tail = dq.back(); |
| while (true) { |
| int next = -1; |
| const auto &vec = g[tail]; |
| for (int to : vec) { |
| if (seen[to] != timer_cnt) { |
| next = to; |
| break; |
| } |
| } |
| if (next == -1) break; |
| dq.push_back(next); |
| seen[next] = timer_cnt; |
| tail = next; |
| } |
|
|
| |
| int head = dq.front(); |
| while (true) { |
| int next = -1; |
| const auto &vec = rg[head]; |
| for (int from : vec) { |
| if (seen[from] != timer_cnt) { |
| next = from; |
| break; |
| } |
| } |
| if (next == -1) break; |
| dq.push_front(next); |
| seen[next] = timer_cnt; |
| head = next; |
| } |
| } else { |
| |
| int head = dq.front(); |
| while (true) { |
| int next = -1; |
| const auto &vec = rg[head]; |
| for (int from : vec) { |
| if (seen[from] != timer_cnt) { |
| next = from; |
| break; |
| } |
| } |
| if (next == -1) break; |
| dq.push_front(next); |
| seen[next] = timer_cnt; |
| head = next; |
| } |
|
|
| |
| int tail = dq.back(); |
| while (true) { |
| int next = -1; |
| const auto &vec = g[tail]; |
| for (int to : vec) { |
| if (seen[to] != timer_cnt) { |
| next = to; |
| break; |
| } |
| } |
| if (next == -1) break; |
| dq.push_back(next); |
| seen[next] = timer_cnt; |
| tail = next; |
| } |
| } |
|
|
| vector<int> path; |
| path.reserve(dq.size()); |
| path.assign(dq.begin(), dq.end()); |
| return path; |
| } |
|
|
| int main() { |
| ios::sync_with_stdio(false); |
| cin.tie(nullptr); |
|
|
| if (!(cin >> n >> m)) return 0; |
| int tmp; |
| for (int i = 0; i < 10; ++i) cin >> tmp; |
|
|
| g.assign(n + 1, {}); |
| rg.assign(n + 1, {}); |
| vector<int> deg(n + 1, 0); |
|
|
| for (int i = 0; i < m; ++i) { |
| int u, v; |
| cin >> u >> v; |
| g[u].push_back(v); |
| rg[v].push_back(u); |
| ++deg[u]; |
| ++deg[v]; |
| } |
|
|
| seen.assign(n + 1, 0); |
|
|
| |
| vector<int> order(n); |
| for (int i = 0; i < n; ++i) order[i] = i + 1; |
| sort(order.begin(), order.end(), [&](int x, int y) { |
| return deg[x] > deg[y]; |
| }); |
|
|
| int C = min(30, n); |
| vector<int> bestPath; |
|
|
| for (int i = 0; i < C; ++i) { |
| int s = order[i]; |
| |
| vector<int> p1 = buildPathFrom(s, true); |
| if (p1.size() > bestPath.size()) bestPath.swap(p1); |
| vector<int> p2 = buildPathFrom(s, false); |
| if (p2.size() > bestPath.size()) bestPath.swap(p2); |
| } |
|
|
| |
| if (bestPath.empty()) { |
| bestPath.push_back(1); |
| } |
|
|
| cout << bestPath.size() << '\n'; |
| for (size_t i = 0; i < bestPath.size(); ++i) { |
| if (i) cout << ' '; |
| cout << bestPath[i]; |
| } |
| cout << '\n'; |
|
|
| return 0; |
| } |