#include<iostream>
#include<stack>
#include<vector>
#include<set>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX=10005;
vector<vector<int>> G(MAX);
stack<int> st;
int dfn[MAX];
int low[MAX];
int instack[MAX];
int tim=1;
int colornum=1;
int color[MAX];
int num[MAX];
void dfs(int x){
dfn[x]=tim;
low[x]=tim++;
st.push(x);
instack[x]=1;
for(auto i :G[x]){
if(dfn[i]==0){
dfs(i);
low[x]=min(low[x], low[i]);
}
else if(instack[i])
low[x]=min(low[x],dfn[i]);
}
if(dfn[x]==low[x]){
int tmp=st.top();st.pop();
color[tmp]=colornum;
num[colornum]++;
while(tmp!=x){
tmp=st.top();st.pop();
color[tmp]=colornum;
num[colornum]++;
}
colornum++;
}
}
int main(){
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(instack,0,sizeof(instack));
memset(num,0,sizeof(num));
int n,m;cin>>n>>m;
for(int i=0;i<m;++i){
int x,y;
cin>>x>>y;
G[x-1].push_back(y-1);
}
for(int i=0;i<n;++i){
if(dfn[i]==0)
dfs(i);
}
int flag[colornum];
memset(flag,0,sizeof(flag));
for(int i=0;i<n;++i){
for(auto j:G[i]){
if(color[i]!=color[j]){
flag[color[i]]=1;
}
}
}
int count=0;
int ans=0;
for(int i=1;i<colornum;++i){
if(flag[i]==0){
count++;
ans+=num[i];
}
}
if(count==1) cout<<ans;
else{
cout<<0;
}
}