#include using namespace std; const int nmax=1e5+42; int read_int() { char c='?'; while(isdigit(c)==0)c=getchar(); int ret=0; while(isdigit(c)) { ret=ret*10+c-'0'; c=getchar(); } return ret; } int n,m; int nxt[nmax]; vector bck[nmax],adj[nmax]; bool solved[nmax]; int parent[nmax]; bool been[nmax]; int root(int node) { if(parent[node]==node)return node; parent[node]=root(parent[node]); return parent[node]; } int solve() { n=read_int(); m=read_int(); for(int i=0;i<=n;i++) { bck[i]={}; adj[i]={}; nxt[i]=-1; solved[i]=0; } for(int i=1;i<=m;i++) { int u=read_int(); int v=read_int(); bck[v].push_back(u); adj[u].push_back(v); } for(int i=0;i<=n;i++) if(solved[i]==0) { vector from=bck[i]; if(from.size()==0)return 0; vector to=adj[from[0]]; if(from.size()!=to.size())return 0; for(int j=0;j from=bck[i]; vector< pair > seen={}; for(auto w:from) been[root(w)]=0; for(auto w:from) if(been[root(w)]==0) { been[root(w)]=1; seen.push_back({w,nxt[w]}); } for(int j=0;j