#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include<stack> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int N=2e4+10; const int M=1e6+10; struct Edge{ int to,nxt; }edge[M]; int head[N]; int tot; void init(){ memset(head,-1,sizeof head); tot=0; } void addEdge(int u,int v){ edge[tot].to=v; edge[tot].nxt=head[u]; head[u]=tot++; } int n,m; int col[N]; int in[N],out[N]; int low[N]; int dep[N]; int c; int id; stack<int> sta; bool vis[N]; void dfs(int u){ ++id; low[u]=dep[u]=id; vis[u]=true; sta.push(u); for(int k=head[u];~k;k=edge[k].nxt){ int v=edge[k].to; if(dep[v]==-1){ dfs(v); low[u]=min(low[u],low[v]); }else if(vis[v]){ low[u]=min(low[u],dep[v]); } } if(low[u]==dep[u]){ int v; ++c; do{ v=sta.top(); vis[v]=false; sta.pop(); col[v]=c; }while(u!=v); } } int tarjan(){ c=0; id=0; while(!sta.empty()) sta.pop(); memset(dep,-1,sizeof dep); memset(vis,0,sizeof vis); memset(in,0,sizeof in); memset(out,0,sizeof out); for(int i=1;i<=n;i++) if(dep[i]==-1) { dfs(i); } for(int u=1;u<=n;u++){ for(int k=head[u];~k;k=edge[k].nxt){ int v=edge[k].to; if(col[u]!=col[v]){ in[col[v]]++; out[col[u]]++; } } } if(c==1) return 0; int ii=0; int oo=0; for(int i=1;i<=c;i++){ if(in[i]==0) ii++; if(out[i]==0) oo++; } return max(ii,oo); } int main() { //freopen("in","r",stdin); //freopen("out.txt","w",stdout); int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); addEdge(u,v); } printf("%d\n",tarjan()); } return 0; }