#include #define pow power #define ll long long #define ull unsigned long long using namespace std; templatevoid read(T &x) { x=0;int f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0'; x=x*f; } templateinline void write(T x) { if(x==0) { putchar('0'); return; } int len=0; short c[55]; if(x<0) x=-x,putchar('-'); while(x) c[len++]=x%10+'0',x/=10; while(len--) putchar(c[len]); } templatevoid writeln(T x) { write(x); putchar('\n'); } templatevoid writesp(T x) { write(x); putchar(' '); } const int N=5005; int id,T,n,m,s,t,cnt,head[N<<1]; struct qwq{int v,nxt,c;}edge[N<<3]; void add(int x,int y,int c){ edge[++cnt]=(qwq){y,head[x],c}; head[x]=cnt; } queueq; int dep[N<<1],du[N]; bool bfs(){ while(!q.empty()) q.pop(); for(int i=0;i<=2*n+1;i++) dep[i]=0; q.push(s); dep[s]=1; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i;i=edge[i].nxt){ int v=edge[i].v,c=edge[i].c; if(dep[v]||!c) continue; dep[v]=dep[u]+1; if(v==t) return 1; q.push(v); } } return 0; } int dfs(int u,int flow){ if(u==t) return flow; int rest=flow; for(int i=head[u];i;i=edge[i].nxt){ int v=edge[i].v,c=edge[i].c; if(dep[v]==dep[u]+1&&c){ int nwfl=dfs(v,min(rest,c)); if(!nwfl) dep[v]=0; edge[i].c-=nwfl; edge[i^1].c+=nwfl; rest-=nwfl; if(!rest) break; } } return flow-rest; } int main() { // freopen("aka.in","r",stdin); // freopen("aka.out","w",stdout); // read(id); read(T); T=1; while(T--){ read(n); read(m); cnt=1; int gu=0; memset(head,0,sizeof(head)); memset(du,0,sizeof(du)); for(int i=1;i<=n;i++){ add(0,i,1); add(i,0,0); add(i+n,2*n+1,1); add(2*n+1,i+n,0); } for(int i=1;i<=m;i++){ int u,v; read(u),read(v); du[u]++,du[v]++; add(u,v+n,1); add(v+n,u,0); add(v,u+n,1); add(u+n,v,0); } for(int i=1;i<=n;i++){ if(!du[i]) gu++; } s=0,t=2*n+1; int flow=0; while(bfs()) flow+=dfs(s,(1<<30)); if(flow==n-1&&gu==1) flow--; cout<