#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
struct Edge{int from,to,next;};
Edge a[maxn*10+10];
int N,M;
int head[maxn*10+9000],nond,cnt[maxn],frn[maxn],stank[maxn],low[maxn],color[maxn],du[maxn],K,tot,ans;
bool jb[maxn];
void Tarjan(int bj){
nond++;
frn[bj]=low[bj]=nond;
stank[++K]=bj;
jb[bj]=true;
for (int i=head[i];i;i=a[i].next){
int x=a[i].to;
if (!frn[x]){
Tarjan(x);
low[bj]=min(low[x],low[bj]);
}
else if (jb[x]) low[bj]=min(low[bj],frn[x]);
}
if (low[bj]==frn[bj]){
tot++;
do{
color[stank[K]]=tot;
cnt[tot]++;
jb[stank[K]]=false;
K--;
}while(bj!=stank[K+1]);
}
}
int main(){
scanf ("%d%d",&N,&M);
for (int i=1;i<=M;i++){
scanf ("%d%d",&a[i].from,&a[i].to);
a[i].next=head[a[i].from];
head[a[i].from]=i;
}
for (int i=1;i<=N;i++)
if (!frn[i]) Tarjan(i);
for (int i=1;i<=N;i++)
for (int j=head[i];j;j=a[j].next){
if (color[a[j].to]!=color[i])
du[color[i]]++;
}
for (int i=1;i<=tot;i++){
if (!du[i]){
if (ans){cout<<0;return 0;}
ans=i;
}
}
cout<<cnt[ans];
return 0;
}