int ancCnt; int anc[MAXN]; inlinevoidancInit(int siz){ for (int i = 1; i <= siz; ++i) anc[i] = i; return; } inlineintfindAnc(int cur){ if (anc[cur] != cur) anc[cur] = findAnc(anc[cur]); return anc[cur]; } inlinevoidmerge(int a, int b){ anc[findAnc(b)] = findAnc(a); return; }
intmain(){ scanf("%d%d", &n, &m); ancInit(n); for (int i = 1; i <= m; ++i) { int a, b; scanf("%d%d", &a, &b); if (pre[b] == a && suf[a] == b) continue; int ancA = findAnc(a); int ancB = findAnc(b); if (ancA != ancB && !pre[b] && !suf[a]) { merge(a, b); suf[a] = b; pre[b] = a; } else cout << "0", exit(0); } for (int i = 1; i <= n; ++i) if (findAnc(i) == i) ancCnt++; for (int i = 1; i <= ancCnt; ++i) res = (res * i) % mod; cout << res; return0; }