intmain() { int n,m; while (cin >> n >> m) { memset(out,0,sizeof(out)); memset(in,0,sizeof(in)); for (int i = 1; i<=n; i++) { delete node[i].edge; node[i] = Node(); } cnt = 0;
for (int i = 1; i<=m; i++) { int x,y; cin >> x >> y; node[x].edge = newEdge(&node[x],&node[y]); }
for (int i = 1; i<=n; i++) if (node[i].dfn==0) Tarjan(&node[i]);
for (int i = 1; i<=n; i++) { for (Edge *e = node[i].edge; e; e = e->next) if (node[i].color!=e->to->color) { out[node[i].color] ++; in[e->to->color] ++; } }
int ans[2]; ans[0] = ans[1] = 0; for (int i = 1; i<=cnt; i++) { if (!in[i]) ans[0]++; if (!out[i]) ans[1]++; } if (cnt==1) cout << 0 << endl; else cout << max(ans[0],ans[1]) << endl; } }