popular_cow
#include <cstdio>
#include <cstring>
#include <climits> // INT_MAX
#include <vector>
#include <stack>
#include <algorithm>
#define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i)
const int N = 10000;
int n, m;
std::vector <int> graph[N], new_graph[N];
int depth[N], lowest[N], scc_count, id[N];
std::stack <int> stack;
void dfs(int p, int u) {
if (depth[u] == -1) {
int tmp = lowest[u] = depth[u] = p == - 1 ? 0 : depth[p] + 1;
stack.push(u);
foreach (iter, graph[u]) {
int v = *iter;
dfs(u, v);
tmp = std::min(tmp, lowest[v]);
}
lowest[u] = tmp;
if (depth[u] == lowest[u]) {
while (true) {
int v = stack.top();
stack.pop();
id[v] = scc_count;
lowest[v] = INT_MAX;
if (u == v) {
break;
}
}
scc_count ++;
}
}
}
bool vis[N];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0, a, b; i < m; ++ i) {
scanf("%d%d", &a, &b);
a --;
b --;
graph[b].push_back(a);
}
memset(depth, -1, sizeof(depth));
scc_count = 0;
for (int i = 0; i < n; ++ i) {
dfs(-1, i);
}
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; ++ i) {
foreach (iter, graph[i]) {
int j = *iter;
if (id[i] != id[j]) {
vis[id[j]] = true;
}
}
}
int ans = 0, cnt = 0, scc_ko;
for (int i = scc_count - 1; i >= 0; -- i) {
if (!vis[i]) {
cnt++;
scc_ko = i;
}
}
if (cnt != 1) printf("0
");
else {
for (int i = 0; i < n; i++) {
if (id[i] == scc_ko) ++ans;
}
printf("%d
", ans);
}
return 0;
}