int n, m, fl = 1; int cnt[kMaxN], sum[kMaxN], fa[kMaxN]; bool ins[kMaxN], vis[kMaxN]; std::vector<int> G[kMaxN];
intfind(int x){ return x == fa[x] ? x : fa[x] = find(fa[x]); }
voidunionn(int x, int y){ int fx = find(x), fy = find(y); if (fx != fy) fa[fx] = fy; }
voiddfs1(int u){ vis[u] = ins[u] = 1; for (auto v : G[u]) { if (!vis[v]) { dfs1(v); } else { if (!ins[v]) fl = 0; else ++cnt[u], --cnt[v], sum[u] += v, sum[v] -= v; } } ins[u] = 0; }
voiddfs2(int u){ ins[u] = 1; for (auto v : G[u]) { if (!ins[v]) { dfs2(v); cnt[u] += cnt[v], sum[u] += sum[v]; } else { } } ins[u] = 0; }
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) G[i].clear(); for (int i = 1; i <= m; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v); } std::vector<int> vec; for (int i = 1; i <= n; ++i) vec.emplace_back(i); std::shuffle(vec.begin(), vec.end(), std::mt19937(std::chrono::steady_clock::now().time_since_epoch().count())); for (int i = 0; i < std::min(100, (int)vec.size()); ++i) { int x = vec[i]; for (int i = 1; i <= n; ++i) { fa[i] = i; cnt[i] = sum[i] = ins[i] = vis[i] = 0; } fl = 1, dfs1(x); if (!fl) continue; std::fill_n(ins + 1, n, 0); dfs2(x); for (int i = 1; i <= n; ++i) { if (cnt[i] == 1) { unionn(i, sum[i]); } } std::vector<int> idx; for (int i = 1; i <= n; ++i) if (find(i) == find(x)) idx.emplace_back(i); if (idx.size() >= (n + 4) / 5) { for (auto u : idx) std::cout << u << ' '; std::cout << '\n'; } else { std::cout << "-1\n"; } return; } std::cout << "-1\n"; }