#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxn=1e4+5;
int n,m,num,tot,ans;
int X[maxn],Y[maxn];
int dfn[maxn],low[maxn];
int sum[maxn],mark[maxn];
int flag=0;
bool vis[maxn];
vector<int> v[maxn],v2[maxn];
stack<int> st;
void dfs(int k){
dfn[k]=low[k]=++num;
vis[k]=1;
st.push(k);
for(int i=0;i<v[k].size();i++){
if(!dfn[v[k][i]]){
dfs(v[k][i]);
low[k]=min(low[k],low[v[k][i]]);
}
else
if(vis[v[k][i]])
low[k]=min(low[k],low[v[k][i]]);
}
if(dfn[k]==low[k]){
tot++;
while(1){
int TOP=st.top();
st.pop();
mark[TOP]=tot;
sum[tot]++;
vis[TOP]=0;
if(k==TOP)
break;
}
}
return ;
}
void Tarjan(){
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i);
return ;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&X[i],&Y[i]);
v[X[i]].push_back(Y[i]);
}
Tarjan();
for(int i=1;i<=m;i++)
if(mark[X[i]]!=mark[Y[i]])
v2[mark[X[i]]].push_back(mark[Y[i]]);
for(int i=1;i<=tot;i++)
if(!v2[i].size())
if(flag){
flag=0;
break;
}
else{
flag=1;
ans=sum[i];
}
if(flag)
printf("%d\n",ans);
else
puts("0");
}