#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define N 50010
struct edge{
int from;
int to;
}e[N];
int dfn[N]={},low[N];
vector<int>ed[N];
int lt[N]={};
int gs[N]={};
int rd[N]={};
int n,m,num=1;
stack<int> s;
void getdfn(int a){
low[a]=dfn[a];
s.push(a);
for(int i=0;i<ed[a].size();i++){
if(dfn[ed[a][i]]==0) {
num++;
dfn[ed[a][i]]=num;
getdfn(ed[a][i]);
}
low[a]=min(low[a],low[ed[a][i]]);
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
int tmp1,tmp2;
for(int i=1;i<=m;i++){
scanf("%d",&tmp1);
scanf("%d",&tmp2);
ed[tmp1].push_back(tmp2);
e[i].from=tmp1;e[i].to=tmp2;
}
dfn[1]=1;
getdfn(1);
num=1;
while(!s.empty()){
int tt=s.top();
lt[num]++;
gs[tt]=num;
if(low[tt]==dfn[tt])
num++;
s.pop();
}
if(lt[num]==0)
num--;
for(int i=1;i<=m;i++){
if(gs[e[i].from]!=gs[e[i].to]) rd[gs[e[i].from]]++;
}
int ans=0,f=0;
for(int i=1;i<=num;i++){
if(rd[i]==0) {
ans=lt[i];
f++;
}
}
if(n!=1&&m==0) printf("0\n");
else if(f==1)printf("%d\n",ans);
else printf("0\n");
return 0;
}