#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,ans,cnt,sign;
int dfn[N],low[N],vis[N],scc[N],out_d[N],in_d[N];
int stk0[N],cn;
vector<int> pic[N],scc_[N];
queue<int> q;
void _set(){
cn=0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(scc,0,sizeof(scc));
memset(out_d,0,sizeof(out_d));
}
void tarjan(int u);
int main(){
_set();
int u,v;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
pic[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!vis[i])tarjan(i);
}
for(int i=1;i<=n;++i){
for(int j=0;j<pic[i].size();++j){
int v=pic[i][j];
if(scc[i]!=scc[v]){
out_d[scc[i]]++;
in_d[scc[v]]++;
}
}
}
int t=0;
for(int i=1;i<=cnt;++i){
if(out_d[i]==0){
if(t!=0) {
cout<<0<<endl;
return 0;
}
t=i;
}
}
cout<<scc_[t].size()<<endl;
return 0;
}
void tarjan(int u){
int v;
dfn[u]=low[u]=sign++;
stk0[++cn]=u;
vis[u]=1;
for(int i=0;i<pic[u].size();i++){
if(!dfn[pic[u][i]]){
tarjan(pic[u][i]);
low[u]=min(low[u],low[pic[u][i]]);
}
else if(vis[pic[u][i]]){
low[u]=min(low[pic[u][i]],low[u]);
}
}
if(low[u]==dfn[u]){
cnt++;
do{
v=stk0[cn--];
scc_[cnt].push_back(v);
scc[v]=cnt;
}while(u!=v);
}
}