| #include <iostream> |
| #include <vector> |
| #include <numeric> |
| #include <algorithm> |
| #include <deque> |
|
|
| int main() { |
| std::ios_base::sync_with_stdio(false); |
| std::cin.tie(NULL); |
|
|
| int n, m; |
| std::cin >> n >> m; |
|
|
| |
| std::vector<int> a(10); |
| for (int i = 0; i < 10; ++i) { |
| std::cin >> a[i]; |
| } |
|
|
| std::vector<std::vector<int>> adj(n + 1); |
| std::vector<std::vector<int>> rev_adj(n + 1); |
| std::vector<int> in_degree(n + 1, 0); |
| std::vector<int> out_degree(n + 1, 0); |
|
|
| for (int i = 0; i < m; ++i) { |
| int u, v; |
| std::cin >> u >> v; |
| adj[u].push_back(v); |
| rev_adj[v].push_back(u); |
| out_degree[u]++; |
| in_degree[v]++; |
| } |
|
|
| |
| int start_node = 1; |
| long long max_score = -2000000001LL; |
| for (int i = 1; i <= n; ++i) { |
| long long current_score = (long long)out_degree[i] - in_degree[i]; |
| if (current_score > max_score) { |
| max_score = current_score; |
| start_node = i; |
| } |
| } |
|
|
| std::deque<int> path; |
| path.push_back(start_node); |
| std::vector<bool> visited(n + 1, false); |
| visited[start_node] = true; |
|
|
| while (path.size() < n) { |
| bool extended = false; |
|
|
| |
| int u_fwd = path.back(); |
| int best_v_fwd = -1; |
| int min_in = n + 1; |
|
|
| for (int v : adj[u_fwd]) { |
| if (!visited[v]) { |
| if (best_v_fwd == -1 || in_degree[v] < min_in || (in_degree[v] == min_in && v < best_v_fwd)) { |
| min_in = in_degree[v]; |
| best_v_fwd = v; |
| } |
| } |
| } |
|
|
| if (best_v_fwd != -1) { |
| path.push_back(best_v_fwd); |
| visited[best_v_fwd] = true; |
| extended = true; |
| continue; |
| } |
|
|
| |
| int u_bwd = path.front(); |
| int best_v_bwd = -1; |
| int min_out = n + 1; |
|
|
| for (int v : rev_adj[u_bwd]) { |
| if (!visited[v]) { |
| if (best_v_bwd == -1 || out_degree[v] < min_out || (out_degree[v] == min_out && v < best_v_bwd)) { |
| min_out = out_degree[v]; |
| best_v_bwd = v; |
| } |
| } |
| } |
| |
| if (best_v_bwd != -1) { |
| path.push_front(best_v_bwd); |
| visited[best_v_bwd] = true; |
| extended = true; |
| continue; |
| } |
|
|
| |
| if (!extended) { |
| break; |
| } |
| } |
|
|
| std::cout << path.size() << "\n"; |
| for (size_t i = 0; i < path.size(); ++i) { |
| std::cout << path[i] << (i == path.size() - 1 ? "" : " "); |
| } |
| std::cout << "\n"; |
|
|
| return 0; |
| } |