#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) x.begin(), x.end() using namespace std; using ll=long long; const double eps = 1e-10; const int mod = 1000000007; void DFS(const vector>& g, int u, vector& used, vector& to_go) { used[u] = true; for (int v : g[u]) { if (!used[v]) { DFS(g, v, used, to_go); } } to_go.push_back(u); } vector DFSGo(const vector>& h) { int n = h.size(); vector used(n); vector to_go(n); for (int u = 0; u < n; ++u) { if (!used[u]) { DFS(h, u, used, to_go); } } return to_go; } void DFSKss(const vector>& g, int u, vector& kss, int comp) { kss[u] = comp; for (int v : g[u]) { if (kss[v] == -1) { DFSKss(g, v, kss, comp); } } } vector> Condense(const vector>& g) { int n = g.size(); vector> h(n); for (int u = 0; u < n; ++u) { for (int v : g[u]) h[v].push_back(u); } vector to_go = DFSGo(h); reverse(all(to_go)); vector kss(n, -1); int comp = 0; for (int u : to_go) { if (kss[u] == -1) { DFSKss(g, u, kss, comp++); } } vector> condensed(comp); for (int u = 0; u < n; ++u) { for (int v : g[u]) { if (kss[u] == kss[v]) continue; condensed[kss[u]].insert(kss[v]); } } return condensed; } void Solve() { int n, e; cin >> n >> e; vector> g(n); for (int i = 0; i < e; ++i) { int u, v; cin >> u >> v; g[u].push_back(v); } auto condense = Condense(g); for (int u = 0; u < condense.size(); ++u) { cout << u << ": "; for (int v : condense[u]) cout << v << " "; cout << "\n"; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); Solve(); return 0; }