#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) { vector V; for(y=x;y>N>>M; FOR(i,N) { FOR(j,N) edge[i][j]=-1; in[i]=out[i]=edge[i][i]=N-1; self[i]=1; } FOR(i,M) { cin>>x>>y; x--,y--; if(x==y) { self[x]=0; } else { out[x]--; in[y]--; edge[x][y]=0; edge[y][y]--; } } 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 || x==1) 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]]+mo)%mo; cout<<(pat*deg%mo*det_mo(N-1)%mo)<