#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#define int long long
using namespace std;
namespace IO
{
template<typename T>
T read(T x)
{
T sum = 0, opt = 1;
char ch = getchar();
while(!isdigit(ch)) opt = (ch == '-') ? -1 : 1, ch = getchar();
while( isdigit(ch)) sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
return sum * opt;
}
}
#define read IO::read(0)
#define rep(i, n) for(int i = 1; i <= n; i ++)
#define repa(i, n) for(int i = 0; i < n; i ++)
#define repb(i, n) for(int i = 1; i <= n; i ++)
#define repc(i, n) for(int i = 0; i < n; i ++)
#define lson (u << 1)
#define rson (u << 1 | 1)
#define gcd(a, b) __gcd(a, b)
const int N = 1e6 + 5, MOD = 1e8;
int ans;
int a[N]], dfn[N], low[N];
bool vis[N], num[N], f[N], out[N];
vector<int> g[N];
stack<int> st;
int t, cnt;
void tarjan(int u)
{
dfn[u] = low[u] = ++t;
vis[u] = 1;
st.push(u);
for(int i = 0;i < g[u].size();i ++ ){
int v = g[u][i];
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]){
cnt ++ ;
int k;
do
{
k = st.top();
vis[k] = 0;
num[cnt] ++ ;
f[k] = cnt;
st.pop();
} while (k != u);
}
}
void solve()
{
int n = read, m = read;
for(int i = 1;i <= m;i ++ ){
int a = read, b = read;
g[a].push_back(b);
}
for(int i = 1;i <= n;i ++ ){
if(!dfn[i]) tarjan(i);
}
for(int u = 1;u <= n;u ++ ){
for(int i = 0;i < g[u].size();i ++ ){
int v = g[u][i];
if(f[u] != f[v]) out[f[u]] ++ ;
}
}
int ans = -1;
for(int i = 1;i <= n;i ++ ){
if(out[i] == 0 && ans == -1) {
ans = i;
}
else if(out[f[i]] == 0 && ans != -1){
cout << 0;
return ;
}
}
cout << num[ans] << endl;
}
signed main()
{
int T = 1;
while(T -- ) solve();
return 0;
}