rt
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const int mxn = 5e4 + 10;
#define read(x) {\
int abc = 0, cba = 1;\
char bca = getchar();\
while(bca > '9' ||bca < '0') {\
if(bca == '-') cba = -1;\
bca = getchar();\
}\
while('0' <= bca && bca <= '9') {\
abc = (abc << 1) + (abc << 3) + (bca ^ 48);\
bca = getchar();\
}\
x = cba*abc;\
}
inline void write(int x);
int n, m;
struct merry {
int nxt, to;
} umy[mxn];
int head[mxn], cnt;
int sta[mxn], insta[mxn], top;
int dfn[mxn], low[mxn], inde;
int belong[mxn];
int out[mxn], tot[mxn];
int num;
inline void add(int nxt, int to){
umy[++cnt].nxt = head[nxt];
head[nxt] = cnt;
umy[cnt].to = to;
}
inline void tarjan(int u){
int to;
dfn[u] = low[u] = ++inde;
sta[++top] = u;
insta[u] = 1;
for(int i = head[u]; i; i = umy[i].nxt){
to = umy[i].to;
if(!dfn[to]){
tarjan(to);
low[u] = min(low[u], low[to]);
}
else if(insta[to]){
low[u] = min(dfn[u], low[to]);
}
}
if(dfn[u] == low[u]){
num++;
do{
to = sta[top--];
belong[to] = num;
insta[to] = 0;
tot[num]++;
}while (u != to);
}
}
signed main() {
// freopen("1.in", "r", stdin);
// freopen("1.in", "w", stdout);
read(n); read(m);
for(int i = 1; i <= m; i++){
int a, b;
read(a); read(b);
add(a, b);
}
for(int i = 1; i <= n; i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int u = 1; u <= n; u++){
for(int i = head[u]; i; i = umy[i].nxt){
int to = umy[i].to;
if(belong[u] != belong[to]){
out[belong[u]]++;
}
}
}
int ccc = 0;
for(int i = 1; i <= num; i++){
if(!out[i]){
if(ccc){
puts("0");
return 0;
}
ccc = i;
}
}
write(tot[ccc]);
return 0;
}
inline void write(int x) {
if(x < 0) putchar('-'), x = -x;
if(x < 10) putchar(x + '0');
else write(x / 10), putchar((x % 10) + '0');
}