#include using namespace std; int n, m; vector> adj; vector outdeg, indeg; vector visited; vector path; bool dfs(int u, int count) { path.push_back(u); visited[u] = 1; if (count == n) return true; for (int v : adj[u]) { if (!visited[v]) { if (dfs(v, count + 1)) return true; } } path.pop_back(); visited[u] = 0; return false; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 0; i < 10; i++) { int x; cin >> x; } adj.assign(n + 1, {}); indeg.assign(n + 1, 0); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); indeg[v]++; } outdeg.assign(n + 1, 0); 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 a, int b) { return outdeg[a] < outdeg[b]; }); } int min_ind = INT_MAX; for (int i = 1; i <= n; i++) { min_ind = min(min_ind, indeg[i]); } vector candidates; for (int i = 1; i <= n; i++) { if (indeg[i] == min_ind) candidates.push_back(i); } sort(candidates.begin(), candidates.end(), [&](int a, int b) { if (outdeg[a] != outdeg[b]) return outdeg[a] < outdeg[b]; return a < b; }); bool found = false; visited.assign(n + 1, 0); path.reserve(n); for (int st : candidates) { fill(visited.begin(), visited.end(), 0); path.clear(); if (dfs(st, 1)) { found = true; break; } } if (found && (int)path.size() == n) { cout << n << '\n'; for (size_t i = 0; i < path.size(); i++) { if (i) cout << " "; cout << path[i]; } cout << '\n'; } else { cout << 1 << '\n'; cout << 1 << '\n'; } return 0; }