#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e4+5;
struct node{
int nxt,to;
}g[2*N];
int head[N],tot,id,dfn[N],low[N],st[N],top,inst[N],c[N],cnt,n,m,s[N],du[N],f;
void add(int u,int v){
g[tot].to=v;
g[tot].nxt=head[u];
head[u]=tot++;
}
void tarjan(int u){
dfn[u]=low[u]=++id;
st[++top]=u,inst[u]=1;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(inst[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int t=0;
cnt++;
while(t!=u){
s[cnt]++;
t=st[top--];
c[t]=cnt;
inst[t]=0;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
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=g[j].nxt) if(c[i]!=c[g[j].to]) du[c[i]]++;
for(int i=1;i<=cnt;i++){
if(!du[i]){
if(f){
printf("0");
return 0;
}
f=i;
}
}
printf("%d",s[f]);
return 0;
}