#include <iostream>
#include <cstdio>
using namespace std;
int sum, n, m;/*sum是需要的桌子数*/
int father[1005];/*用来存储自己所在的门派信息,哈哈*/
int main()
{
void makeset(int);
int findset(int);
void unionset(int,int);
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
sum=n;/*刚开始的时候大家都不认识,需要n张桌子*/
makeset(n);/*将n个*/
int data1,data2;
for(int i=1; i<=m; i++)
{
scanf("%d%d",&data1,&data2);
unionset(data1,data2);
}
printf("%d\n",sum);
}
return 0;
}
void makeset(int n)//建一个大小为n的并查集
{
for(int i=1; i<=n; i++)
father[i]=i;
}
int findset(int x)//查找
{
if(x!=father[x])
father[x]=findset(father[x]);//回溯,路径压缩
return father[x];
}
void unionset(int a, int b)//合并,要用到findset查找函数
{
int x=findset(a);
int y=findset(b);
if(x==y)
return;
sum=sum-1;/*由于执行的是并操作,如果x和y不相等,证明两者原本不在一个集合里,
因此合并之后桌子总数要减去1,并且要把father[y]赋值为x,而不是把father[b]赋值为x*/
father[y]=x;
}