#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,h,ans,mp[2000010],q[2000010],top,dfsn[2000010],low[2000010],vis[2000010],k,cnt;
vector<int>g[20010];
void dfs(int u){
q[++top]=u;
dfsn[u]=++k;
low[u]=k;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(!dfsn[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(!vis[u]){//注意这里,本来应该是v的,我写成u也能过
low[u]=min(low[u],dfsn[v]);
}
}
if(low[u]==dfsn[u]){
cnt++;
int l=0;
while(1){
int v=q[top];
top--;
vis[v]=cnt;
if(u==v){
break;
}
l++;
}
if(l==0){
h++;
}
}
}
void tarjan(int n){
for(int i=1;i<=n;i++){
if(!dfsn[i]){
dfs(i);
}
}
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
tarjan(n);
for(int i=1;i<=n;i++){
ans+=(mp[vis[i]]==0);
mp[vis[i]]=1;
}
cout<<ans-h;
return 0;
}