#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; vector<int> g[maxn]; vector<int> rg[maxn]; vector<int> vs; bool vis[maxn]; int camp[maxn]; void add_edge(int x,int y) { g[x].push_back(y); rg[y].push_back(x); } void dfs(int x) { vis[x]=1; for(int i=0;i<g[x].size();i++) if(!vis[g[x][i]]) dfs(g[x][i]); vs.push_back(x); } void rdfs(int x,int k) { vis[x]=1; camp[k]=k; for(int i=0;i<rg[x].size();i++) if(!vis[rg[x][i]]) rdfs(rg[x][i],k++); } int main() { int n,m; cin>>n>>m; for(int i=1;i<=m;i++) { int x,y; add_edge(x,y); } for(int i=1;i<=n;i++) { if(!vis[i]) dfs(i); } memset(vis,0,sizeof(vis)); int k=0; for(int i=vs.size();i>=0;i--) { if(!vis[vs[i]]) rdfs(vs[i],k++); } }