#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100100;
struct eage
{
int nt, to;
}e[N];
int head[N], id = 0;
void add(int a, int b)
{
e[++id].to = b;
e[id].nt = head[a];
head[a] = id;
}
int dfn[N], low[N], c[N], res[N], cnt = 0, du[N];
int now = 0;
bool vis[N];
stack<int> st;
void tarjan(int u)
{
dfn[u] = low[u] = ++now;
st.push(u); vis[u] = true;
for (int i = head[u]; i; i = e[i].nt)
{
int v = e[i].to;
if (!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (vis[v])
{
low[u] = min(low[u], dfn[v]);
}
}
int k = 0;
if (low[u] == dfn[u])
{
++cnt;
do
{
k = st.top(); st.pop();
vis[k] = false;
c[k] = cnt; res[k]++;
} while (k != u);
}
}
signed main()
{
int n, m; scanf("%lld%lld", &n, &m);
int a, b;
for (int i = 1; i <= m; i++)
{
scanf("%lld%lld", &a, &b);
add(a, b);
}
for (int i = 1; i <= n; i++)
{
if (!dfn[i])tarjan(i);
}
for (int i = 1; i <= n; i++)
{
for (int j = head[i]; j; j = e[j].nt)
{
if (c[i] != c[j])
{
du[c[i]]++;
}
}
}
int tmp = 0;
for (int i = 1; i <= cnt; i++)
{
if (!du[i])
{
if (tmp) { puts("0"); return 0; }
tmp = i;
}
}
printf("%lld\n", res[tmp]);
return 0;
}