#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,m,head[N],tot;
int dfn[N],low[N],tim;
int sta[N],cnt,num[N];
int sum,in[N],r[N];
bool vis[N];
struct Edge{
int next,from,to;
}e[N];
void adde(int u,int v){
e[++tot].next=head[u];
e[tot].from=u;
e[tot].to=v;
head[u]=tot;
return;
}
void tarjan(int u){
dfn[u]=low[u]==++tim;
vis[u]=1;
sta[++cnt]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
++sum;
while(1){
int now=sta[cnt--];
in[now]=sum;
vis[now]=0;
++num[sum];
if(now==u) break;
}
}
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
adde(v,u);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=1;i<=m;i++){
int u=e[i].from,v=e[i].to;
if(in[u]==in[v]) continue;
++r[in[v]];
}
bool flag=0;
int ans=0;
for(int i=1;i<=sum;i++){
if(!r[i]){
if(flag){
ans=0;
break;
}
flag=1;
ans=num[i];
}
}
cout<<ans<<endl;
return 0;
}