TJALG


#include<bits/stdc++.h>
using namespace std;
const int N=1e4+1;
vector<int>adj[N],radj[N];
int m,n,u,v,res;
stack<int>st;
bool used[N];
void DFS(int u){
used[u]=true;
for(int v:adj[u])if(!used[v])DFS(v);
st.push(u);
}
void DFS1(int u){
used[u]=true;
for(int v:radj[u])if(!used[v])DFS1(v);
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
adj[u].push_back(v);
radj[v].push_back(u);
}
for(int i=1;i<=n;i++)if(!used[i])DFS(i);
memset(used,false,sizeof(used));
while(!st.empty()){
int val=st.top();
st.pop();
if(!used[val]){
DFS1(val);
res++;
}
}
cout<<res;
return 0;
}
//using kosaraju algorithm.