#include using namespace std; typedef signed long long ll; #undef _P #define _P(...) (void)printf(__VA_ARGS__) #define FOR(x,to) for(x=0;x>=1; return r; } ll det_mo(int N) { int x,y,z; ll ret=1; FOR(y,N) FOR(z,N) mat[y][z]=((mat[y][z]%mo)+mo)%mo; FOR(x,N) { if(mat[x][x]==0) { for(y=x+1;y>N>>M; FOR(i,N) in[i]=out[i]=N-1; FOR(i,N) { FOR(j,N) edge[i][j]=-1; edge[i][i]=N-1; self[i]=1; } FOR(i,M) { cin>>A[i]>>B[i]; A[i]--,B[i]--; if(A[i]==B[i]) { self[A[i]]=0; } else { out[A[i]]--; in[B[i]]--; edge[A[i]][B[i]]=0; edge[B[i]][B[i]]--; } } x=0; st=en=-1; FOR(i,N) { if(in[i]==0 && out[i]==0 && self[i]==0) id[i]=-1; else id[i]=x, rid[x]=i, x++; if(abs(in[i]-out[i])>1) return _P("0\n"); if(in[i]==out[i]+1) { if(en!=-1) return _P("0\n"); en=i; } if(out[i]==in[i]+1){ if(st!=-1) return _P("0\n"); st=i; } } if(x==0) return _P("1\n"); ll pat=1; N=x; if(st>=0) { // odd FOR(i,N) if(self[rid[i]]) pat = pat*max(in[rid[i]],out[rid[i]]) % mo; in[st]++; out[en]++; edge[en][st]=-1; edge[st][st]++; } else { ll tot=1; FOR(i,N) if(self[rid[i]]) tot = tot*in[rid[i]] % mo; pat=0; FOR(i,N) { if(self[rid[i]]) (pat += tot*(in[rid[i]]+1)%mo) %= mo; else (pat += tot*in[rid[i]]) %= mo; } } ll deg=1; FOR(i,N) deg = deg*fact[in[rid[i]]-1]%mo; FOR(i,N) FOR(j,N) mat[i][j]=edge[rid[i]][rid[j]]; /* FOR(i,N) { FOR(j,N) _P("%lld ",mat[i][j]); _P("\n"); } cout<