#include<iostream>
#include<cstring>
using namespace std;
int N,M;
int father[30005],a[30005]; /// father存i的父亲节点,a存以i为首(祖宗)的朋友圈的人数
int findf(int x)
{
return father[x] == x?x:father[x]=findf(father[x]); /// 找祖宗 ...
#include<cstring>
using namespace std;
int N,M;
int father[30005],a[30005]; /// father存i的父亲节点,a存以i为首(祖宗)的朋友圈的人数
int findf(int x)
{
return father[x] == x?x:father[x]=findf(father[x]); /// 找祖宗 ...
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>N>>M;
for(int i=1; i<=N; i++) /// 初始化该节点的父亲节点为其本身
father[i]=i;
int x,y,j=0,temp=2; /// temp用来找最大朋友圈数,最小为2(两人为好朋友)
for(int i=0; i<M; i++)
{
cin>>x>>y;
x=findf(x);
//cout<<"x: "<<x<<endl;
y=findf(y);
//cout<<"y: "<<y<<endl;
father[x]=y; /// 第一个人放第二个人下边
//cout<<"###"<<endl;
{
int T;
cin>>T;
while(T--)
{
cin>>N>>M;
for(int i=1; i<=N; i++) /// 初始化该节点的父亲节点为其本身
father[i]=i;
int x,y,j=0,temp=2; /// temp用来找最大朋友圈数,最小为2(两人为好朋友)
for(int i=0; i<M; i++)
{
cin>>x>>y;
x=findf(x);
//cout<<"x: "<<x<<endl;
y=findf(y);
//cout<<"y: "<<y<<endl;
father[x]=y; /// 第一个人放第二个人下边
//cout<<"###"<<endl;
}
memset(a,0,sizeof(a));
for(int i=1; i<=N; i++)
a[findf(i)]++; /// 以find(i)为首的朋友圈有一个加一个
for(int i=1; i<=N; i++)
{
if(temp<a[i])
temp=a[i]; /// 找最大
}
cout<<temp<<endl;
}
memset(a,0,sizeof(a));
for(int i=1; i<=N; i++)
a[findf(i)]++; /// 以find(i)为首的朋友圈有一个加一个
for(int i=1; i<=N; i++)
{
if(temp<a[i])
temp=a[i]; /// 找最大
}
cout<<temp<<endl;
}
}