#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define maxn 10010
using namespace std;
vector<int>G[maxn],rG[maxn],cmp[maxn],vs;
int vis[maxn], cnt, flag;
void dfs(int u){
vis[u] = 1;
for(int i = 0; i < G[u].size(); i++)
if(!vis[G[u][i]])dfs(G[u][i]);
vs.push_back(u);
}
void rdfs(int u){
vis[u] = 1;
if(!flag)cmp[cnt].push_back(u);
for(int i = 0; i < rG[u].size(); i++)
if(!vis[rG[u][i]])rdfs(rG[u][i]);
}
int main(){
int n, m;
cin>>n>>m;
for(int i = 1; i <= m; i++){
int x, y; cin>>x>>y;
G[x].push_back(y);
rG[y].push_back(x);
}
for(int i = 1; i <= n; i++)
if(!vis[i])dfs(i);
memset(vis, 0, sizeof vis);
for(int i = n-1; i >= 0; i--)
if(!vis[vs[i]]){ cnt++; rdfs(vs[i]); }
flag = 1;
memset(vis, 0, sizeof vis);
rdfs(cmp[cnt][0]);
for(int i = 1; i <= n; i++)
if(!vis[i])cmp[cnt].resize(0);
cout<<cmp[cnt].size()<<"\n";
return 0;
}