/*
二分匹配(匈牙利算法)
根据:DAG图的最小路径覆盖数=节点数(n)- 最大匹配数(m)
先用匈牙利算法求出最大匹配数,再用它减去节点数就可以了
*/
#include<iostream>
#include<cstring>
using namespace std;
const int N = 125;
int map_[N][N], vis1[N], vis2[N], flag[N];
int n, m;
bool Search(int x)//判断匹配
{
for(int i = 1; i <= n; i++)
{
flag[x] = 1;
if(map_[x][i] && !flag[i])
{
flag[i] = 1;
if(vis2[i]==-1 || Search(i))//Search(i)是为了寻找增广路
{
vis2[i] = x;
vis1[x] = i;
return true;//匹配成功,返回true
}
}
}
return false;//匹配不成功,返回false
}
int Solve()
{
int ans = 0;
memset(vis1,-1,sizeof(vis1));
memset(vis2,-1,sizeof(vis2));//vis1、vis2都初始化为-1用来标记两点之间是否匹配
for(int i = 1; i <= n; i++)
{
memset(flag,0,sizeof(flag));
if(Search(i)) ans++;//记录匹配的数
}
return ans;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> m;
memset(map_,0,sizeof(map_));
for(int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
map_[a][b] = 1;//把连接在一起的结点标记为1
}
int ans;
ans = Solve();
cout << n-ans << endl;
}
return 0;
}