#include #include #include #include #include #include #include using namespace std; #define print(x) cout<>x #define N 512 #define M 40000 #define SIZE 10240 struct node { int val,next; node(){} node(int ival,int inext) { val=ival;next=inext; } }; int n,m; int a[SIZE],b[SIZE],c[SIZE]; int head[SIZE]; node g[M]; int ind; char instack[SIZE]; stack st; int dfn[SIZE],scc[SIZE],num[SIZE],low[SIZE]; int sccnr,nr; void init() { ind=0; memset(head,-1,sizeof(head)); memset(instack,0,sizeof(instack)); memset(scc,0,sizeof(scc)); memset(num,0,sizeof(num)); memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); st=stack(); nr=1;sccnr=0; } void tarjan(int pos) { low[pos]=dfn[pos]=nr++; st.push(pos); instack[pos]=1; for(int i=head[pos];i!=-1;i=g[i].next) { int j=g[i].val; if(!dfn[j]) { tarjan(j); low[pos]=min(low[pos],low[j]); } else if(instack[j]) { low[pos]=min(low[pos],dfn[j]); } } if(dfn[pos]==low[pos]) { sccnr++; while(1) { int t=st.top(); instack[t]=0; st.pop(); scc[t]=sccnr; num[sccnr]++; if(t==pos) break; } } } bool zSat() { for(int i=0;i>1; makeG(mid); if(zSat()) l=mid+1; else r=mid-1; } return r; } int main() { int T; input(T); while(T--) { input(n>>m); for(int i=0;i