#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
int n,m,tot,ans,index;
int dfn[maxn],low[maxn],du1[maxn],du2[maxn],belong[maxn],vis[maxn];
int stack[maxn];
vector<int>q[maxn];
void init() {
tot=ans=index=0;
memset(du1,0,sizeof(du1));
memset(du2,0,sizeof(du2));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(belong,0,sizeof(belong));
for(int i=0; i<maxn; i++)q[i].clear();
}
void tarjan(int u){
dfn[u]=low[u]=++tot;
stack[++index]=u;
vis[u]=1;
for(int i=0;i<q[u].size();i++){
int v=q[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
ans++;
int t;
do{
t=stack[index--];
vis[t]=0;
belong[t]=ans;//记录该点属于哪个强连通分量
}
while(t!=u);
}
}
void solve(){
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
init();
for(int i=0; i<m; i++) {
int x,y;
scanf("%d%d",&x,&y);
q[x].push_back(y);
}
solve();
if(ans==1) {
printf("0\n");
continue;
}
for(int i=1; i<=n; i++) {
for(int j=0; j<q[i].size(); j++) {
int v=q[i][j];
if(belong[i]!=belong[v]) {
du1[belong[i]]++;
du2[belong[v]]++;
}
}
}
int ans1=0,ans2=0;
for(int i=1; i<=ans; i++) {
if(du1[i]==0) ans1++;
if(du2[i]==0) ans2++;
}
printf("%d\n",max(ans1,ans2));
}
}