#include inline int min(int a, int b) { return a < b ? a : b; } int head[10010], next[50010], to[50010], ecnt; int dfn[10010], low[10010], stk[10010], scc[10010], top, idx, scccnt; bool instk[10010]; int deg[10010]; inline void addEdge(int f, int t) { ecnt++; next[ecnt] = head[f]; head[f] = ecnt; to[ecnt] = t; } void tarjan(int x) { dfn[x] = low[x] = ++idx; instk[stk[top++] = x] = true; for (int cur = head[x]; cur; cur = next[cur]) if (!dfn[to[cur]]) tarjan(to[cur]), low[x] = min(low[x], low[to[cur]]); else if (instk[to[cur]]) low[x] = min(low[x], dfn[to[cur]]); if (dfn[x] == low[x]) { scccnt++; do { top--; scc[stk[top]] = scccnt; instk[stk[top]] = false; } while (stk[top] != x); } } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 0, x, y; i < m; i++) { scanf("%d%d", &x, &y); addEdge(x, y); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int i = 1; i <= n; i++) for (int cur = head[i]; cur; cur = next[cur]) if (scc[i] != scc[to[cur]]) deg[scc[i]]++; int zcnt = 0, id = 0; for (int i = 1; i <= scccnt; i++) if (deg[i] == 0) zcnt++, id = i; if (zcnt != 1) putchar('0'); else { int ans = 0; for (int i = 1; i <= n; i++) if (scc[i] == id) ans++; printf("%d", ans); } return 0; }