#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e4+100;
struct node
{
int u,v;
}e[N*5];
int n,m,ans=0,cnt=0,col=0;
int h[N],dfn[N],low[N],sd[N],k=0,scc[N],sccum[N],out[N];//top(手写栈)
bool f[N];
stack <int> s;
void add(int u,int v)
{
++cnt;
e[cnt].u=h[u];
e[cnt].v=v;
h[u]=cnt;
}
void tarjan(int x)
{
low[x]=dfn[x]=++k;
f[x]=1;//已经遍历过了
s.push(x);
for(int i=h[x];i;i=e[i].u)
{
int v=e[i].v;
if(!dfn[v])
{
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if(f[v])
low[x]=min(low[x],low[v]);
}
if(dfn[x]==low[x])
{
int q;
scc[++col]=x;
while(x!=q)
{
q=s.top();
s.pop();
f[q]=0;
sd[q]=x;
sccum[x]++;
}
}
}
int main()
{
cin>>n>>m;
memset(low,0x3f,sizeof(low));
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
tarjan(i);
}
for(int i=1;i<=n;i++)
{
for(int j=h[i];j;j=e[j].u)
{
int v=e[i].v;
int x=sd[i];
int y=sd[v];
if(x!=y)
out[x]++;
}
}
int sccnt=0;
for(int i=1;i<=col;i++)
{
if(out[scc[i]]==0)
{
sccnt++;
if(sccnt>1)
{
ans=0;
break;
}
ans+=sccum[scc[i]];
}
}
cout<<ans;
}
#3,8,11,12,13,19,20,22WA