inlinevoidadd_edge(int x, int y){ ++A[x][x], ++A[y][y], --A[x][y], --A[y][x]; }
inlineintgauss(int n) { int ans = 1; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) A[i][j] = (A[i][j] + Mod) % Mod;
for (int i = 1; i <= n; ++i) { if (!A[i][i]) { int id = i; for (int j = i + 1; j <= n; ++j) if (A[j][i]) { swap(A[i], A[j]); ans = (LL)ans * (Mod - 1) % Mod; break; } if (!ans) return0; }
int inv = Pow(A[i][i], Mod - 2); for (int j = i + 1; j <= n; ++j) { int now = (LL)A[j][i] * inv % Mod; for (int k = i + 1; k <= n; ++k) Add (A[j][k], Mod - (LL)now * A[i][k] % Mod); A[j][i] = 0; } }
for (int i = 1; i <= n; ++i) ans = (LL)ans * A[i][i] % Mod;