#include<iostream>
using namespace std;
struct G
{
int dest;
G *next;
};
int n,m;
G *ga[20001];
G *gt[20001];
G *g[20001];
int path[20001];
int in[20001];
int out[20001];
int vis[20010];
int part[20001];
char map[20001][20001];
void addedge(G *g[],int i,int j)
{
G *l=new G;
l->dest=j;
l->next=g[i];
g[i]=l;
}
void dfsa(int u)
{
G *l=ga[u];
if(!vis[u])
{
vis[u]=1;
for(l;l!=NULL;l=l->next)
dfsa(l->dest);
path[0]++;
path[path[0]]=u;
}
}
void dfst(int u)
{
G *l=gt[u];
if(!vis[u])
{
vis[u]=1;
for(l;l!=NULL;l=l->next)
dfst(l->dest);
part[u]=part[0];
}
}
void k()
{
int i;
path[0]=0;
memset(vis,0,sizeof(vis));
//搜索原图
for(i=1;i<=n;i++)
{
if(!vis[i])
dfsa(i);
}
memset(vis,0,sizeof(vis));
int sum=0;
part[0]=0;
for(i=n;i>=1;i--)
{
if(!vis[path[i]])
{
part[0]++;
dfst(path[i]);
}
}
//创建新图
G *l;
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)// 剔除连通分量
{
for(l=ga[i];l!=NULL;l=l->next)
{
int k=part[i];
int j=part[l->dest];
if(k!=j&&map[k][j]==0)
{
map[k][j]=1;
addedge(g,k,j);
}
}
}
}
int main()
{
int t;
int a,b,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(m==0)
{
if(n==1)
printf("0
");
else
printf("%d
",n);
continue;
}
for(i=1;i<=n;i++)
ga[i]=gt[i]=NULL;
while(m--)
{
scanf("%d%d",&a,&b);
addedge(ga,a,b);
addedge(gt,b,a);
}
k();
memset(out,0,sizeof(out));
memset(in,0,sizeof(in));
G *l;
int sum=0;
for(i=1;i<=part[0];i++)
{
for(l=g[i];l!=NULL;l=l->next)
{
out[i]++;in[l->dest]++;
}
}
for(i=1;i<=part[0];i++)
if(!out[i]&&in[i])
sum++;
printf("%d
",sum);
}
return 0;
}