#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector a(10); for (int i = 0; i < 10; i++) cin >> a[i]; vector> adj(n + 1), rev(n + 1); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); rev[v].push_back(u); } vector outdeg(n + 1); for (int i = 1; i <= n; i++) outdeg[i] = adj[i].size(); for (int i = 1; i <= n; i++) { sort(adj[i].begin(), adj[i].end(), [&](int x, int y) { if (outdeg[x] != outdeg[y]) return outdeg[x] < outdeg[y]; return x < y; }); } vector vis(n + 1, false); stack order; function dfs1 = [&](int u) { vis[u] = true; for (int v : adj[u]) if (!vis[v]) dfs1(v); order.push(u); }; for (int i = 1; i <= n; i++) if (!vis[i]) dfs1(i); fill(vis.begin(), vis.end(), false); vector scc(n + 1, -1); int scc_cnt = 0; function dfs2 = [&](int u, int id) { vis[u] = true; scc[u] = id; for (int v : rev[u]) if (!vis[v]) dfs2(v, id); }; while (!order.empty()) { int u = order.top(); order.pop(); if (!vis[u]) { dfs2(u, scc_cnt); scc_cnt++; } } vector scc_size(scc_cnt, 0); for (int i = 1; i <= n; i++) scc_size[scc[i]]++; vector> dag_set(scc_cnt); for (int u = 1; u <= n; u++) { int s1 = scc[u]; for (int v : adj[u]) { int s2 = scc[v]; if (s1 != s2) { dag_set[s1].insert(s2); } } } vector> dag(scc_cnt); vector dag_indeg(scc_cnt, 0); for (int i = 0; i < scc_cnt; i++) { for (int j : dag_set[i]) { dag[i].push_back(j); dag_indeg[j]++; } } queue q; vector temp_indeg = dag_indeg; vector topo; for (int i = 0; i < scc_cnt; i++) if (temp_indeg[i] == 0) q.push(i); while (!q.empty()) { int i = q.front(); q.pop(); topo.push_back(i); for (int j : dag[i]) { temp_indeg[j]--; if (temp_indeg[j] == 0) q.push(j); } } vector reach_size(scc_cnt, 0); for (int idx = topo.size() - 1; idx >= 0; idx--) { int i = topo[idx]; reach_size[i] = scc_size[i]; for (int j : dag[i]) { reach_size[i] += reach_size[j]; } } vector candidates; for (int i = 1; i <= n; i++) { if (reach_size[scc[i]] == n) { candidates.push_back(i); } } sort(candidates.begin(), candidates.end(), [&](int x, int y) { if (outdeg[x] != outdeg[y]) return outdeg[x] < outdeg[y]; return x < y; }); vector visited(n + 1, 0); vector path; function dfs = [&](int u, int count) -> bool { path.push_back(u); visited[u] = 1; bool res = (count == n); if (!res) { for (int v : adj[u]) { if (visited[v] == 0) { if (dfs(v, count + 1)) { res = true; break; } } } } if (!res) { path.pop_back(); visited[u] = 0; } return res; }; vector the_path; bool found_ham = false; for (int start : candidates) { fill(visited.begin(), visited.end(), 0); path.clear(); if (dfs(start, 1)) { the_path = path; found_ham = true; break; } } if (found_ham && the_path.size() == static_cast(n)) { cout << n << '\n'; for (size_t i = 0; i < the_path.size(); i++) { cout << the_path[i]; if (i + 1 < the_path.size()) cout << " "; else cout << '\n'; } } else { int some = 1; if (!candidates.empty()) some = candidates[0]; cout << 1 << '\n' << some << '\n'; } return 0; }