#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int n,m;
int tim,vis[10005],cnt,scc[10005],sd[10005],head[10005],net[100005],to[100005],from[100005],ru[100005],dp[100005],tot,dfn[10005],low[10005];
int ans;
stack<int>s;
vector<int>a[10005];
queue<int>q;
void add(int u,int v)
{
net[++tot]=head[u];
head[u]=tot;
to[tot]=v;
from[tot]=u;
}
void tarjan(int x)
{
dfn[x]=low[x]=++tim;
s.push(x);
vis[x]=1;
for(int i=head[x];i;i=net[i])
{
if(!dfn[to[i]])
{
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}
else
{
if(vis[to[i]]==1)
{
low[x]=min(dfn[to[i]],low[x]);
}
}
}
if(dfn[x]==low[x])
{
cnt++;
int y;
do
{
y=s.top();
s.pop();
vis[y]=0;
scc[y]=cnt;
sd[cnt]++;
}while(x!=y);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
tarjan(i);
}
for(int i=1;i<=tot;i++)
{
int x=scc[from[i]],y=scc[to[i]];
if(x!=y)
{
ru[y]++;
a[x].push_back(y);
}
}
for(int i=1;i<=cnt;i++)
{
if(ru[i]==0)
{
q.push(i);
dp[i]=sd[i];
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<a[u].size();i++)
{
dp[a[u][i]]=max(dp[a[u][i]],dp[u]+sd[a[u][i]]);
ru[a[u][i]]--;
if(ru[a[u][i]]==0)
{
q.push(a[u][i]);
}
}
}
for(int i=1;i<=cnt;i++)
{
if(dp[i]==n)
ans+=sd[i];
}
printf("%d",ans);
return 0;
}