#include<iostream>
#include<cstdio>
#define _ 0
using namespace std;
const int MAXN=1e4+5,MAXM=5e4+5;
int n,m,head[MAXN],cnt,ans;
int dfn[MAXN],low[MAXN],stak[MAXN],Time,pot,col[MAXN],tot,sum[MAXN];
bool cud[MAXN];
struct edge{int to,nxt;}e[MAXM];
inline void bild(int f,int t)
{
e[++cnt].nxt=head[f],head[f]=cnt;
e[cnt].to=t;
}
void Tarjan(int x)
{
dfn[x]=low[x]=++Time,stak[++pot]=x;
for(int i=head[x];i;i=e[i].nxt)
{
if(!dfn[e[i].to])
{
Tarjan(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else if(!col[e[i].to])
low[x]=min(low[x],low[e[i].to]);
}
if(dfn[x]==low[x])
{
col[x]=++tot;
++sum[tot];
while(stak[pot]!=x)
{
col[stak[pot--]]=tot;
++sum[tot];
}
--pot;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,A,B;i<=m;++i)
{
scanf("%d%d",&A,&B);
bild(A,B);
}
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=e[i].nxt)
{
if(col[i]!=col[e[j].to])
{cud[col[i]]=1;break;}
}
}
for(int i=1;i<=tot;++i)
{
if(!cud[i])
{
if(!ans) ans=sum[i];
else {
ans=0;break;
}
}
}
printf("%d",ans);
return ~~(0^_^0);
}
10TLE 2WA 9AC