#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,p,head[10050],dfn[10050],low[10050],ins[10050],s[10050];
int col,nu[10050],cd[10050],c[10050];
struct Edge
{
int to,next,from;
}a[50050];
void AddEdge(int h,int t)
{
a[++cnt].to=t;
a[cnt].next=head[h];
head[h]=cnt;
a[cnt].from=h;
}
void Tarjan(int u)
{
dfn[u]=low[u]=++cnt;
ins[u]=1;
s[++p]=u;
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
if(!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
int f;
col++;
do
{
f=s[p];
p--;
c[f]=col;
nu[col]++;
ins[f]=0;
}while(f!=u);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
AddEdge(x,y);
}
int number=cnt;
cnt=0;
for(int i=1;i<=n;i++)
{
if(!dfn[i]) Tarjan(i);
}
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=a[i].next)
{
if(c[i]==c[j]) continue;
cd[c[i]]++;
}
}
int tt=0;
for(int i=1;i<=col;i++)
{
if(!cd[i])
{
if(tt)
{
cout<<0;
return 0;
}
tt=i;
}
}
cout<<nu[tt];
return 0;
}