#include<bits/stdc++.h>
#define FILE "read"
#define MAXN 500010
#define cmin(a,b) a=min(a,b)
#define cmax(a,b) a=max(a,b)
using namespace std;
struct node{int y,next;}e[MAXN<<1];
int T,opt,n,len,ans,Link[MAXN],mx[5],mxf[5],suf[MAXN],pre[MAXN],a[MAXN],f[MAXN][5];
char buf[1<<15],*fs,*ft;
inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,f=1; char ch=getc();
while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getc();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getc();}
return x*f;
}
void insert(int x,int y){e[++len].next=Link[x];Link[x]=len;e[len].y=y;}
void dp(int x,int fa){
int degree=0,top=0,ret=0;
for(int i=Link[x];i;i=e[i].next)if(e[i].y!=fa)dp(e[i].y,x),++degree;
memset(mx,0,sizeof(mx));
memset(mxf,0,sizeof(mxf));
for(int i=Link[x];i;i=e[i].next)if(e[i].y!=fa){
int y=e[i].y;
if(f[y][0]>mx[1]) mx[4]=mx[3],mx[3]=mx[2],mx[2]=mx[1],mx[1]=f[y][0];
else if(f[y][0]>mx[2]) mx[4]=mx[3],mx[3]=mx[2],mx[2]=f[y][0];
else if(f[y][0]>mx[3]) mx[4]=mx[3],mx[3]=f[y][0];
else if(f[y][0]>mx[4]) mx[4]=f[y][0];
a[++top]=f[y][0];
cmax(f[x][2],f[y][2]);
cmax(f[x][2],f[y][1]+1);
cmax(f[x][3],f[y][3]+degree-1);
cmax(f[x][4],f[y][4]+degree-1);
cmax(f[x][3],f[y][1]+degree-1);
cmax(f[x][3],f[y][2]+degree-1);
cmax(f[x][3],f[y][1]+mxf[0]+degree-2);
cmax(f[x][3],f[y][2]+mxf[0]+degree-2);
cmax(f[x][3],f[y][0]+mxf[1]+degree-2);
cmax(f[x][3],f[y][0]+mxf[2]+degree-2);
cmax(mxf[0],f[y][0]);
cmax(mxf[1],f[y][1]);
cmax(mxf[2],f[y][2]);
}
cmax(f[x][0],degree);
cmax(f[x][0],mx[1]+degree-1);
cmax(f[x][1],f[x][0]);
cmax(f[x][1],mx[1]+mx[2]+degree-2);
cmax(f[x][4],mx[1]+mx[2]+mx[3]+degree-3);
cmax(f[x][4],mx[1]+mx[2]+degree-2);
cmax(f[x][4],mx[1]+degree-1);
pre[0]=suf[top+1]=0;
for(int i=1;i<=top;++i)pre[i]=max(pre[i-1],a[i]);
for(int i=top;i>=1;--i)suf[i]=max(suf[i+1],a[i]);
cmax(ret,f[x][1]);
cmax(ret,f[x][3]);
cmax(ret,f[x][4]);
cmax(ret,mx[1]+degree-1);
cmax(ret,mx[1]+mx[2]+degree-2);
cmax(ret,mx[1]+mx[2]+mx[3]+degree-3);
cmax(ret,mx[1]+mx[2]+mx[3]+mx[4]+degree-4);
memset(mx,0,sizeof(mx));
memset(mxf,0,sizeof(mxf));
for(int i=Link[x],j=1;i;i=e[i].next)if(e[i].y!=fa){
int y=e[i].y;
cmax(ret,f[y][0]+mxf[3]+degree-2);
cmax(ret,f[y][3]+mx[1]+degree-2);
cmax(ret,max(f[y][1],f[y][2])+mx[1]+mx[2]+degree-3);
cmax(ret,f[y][0]+max(mxf[1],mxf[2])+suf[j+1]+degree-3);
cmax(ret,max(f[y][1],f[y][2])+pre[j-1]+suf[j+1]+degree-3);
cmax(ret,f[y][1]+mxf[1]+1-(fa?1:0));
cmax(ret,f[y][1]+mxf[2]-(fa?1:0));
cmax(ret,f[y][2]+mxf[1]-(fa?1:0));
cmax(ret,f[y][2]+mxf[2]-1-(fa?1:0));
cmax(ret,f[y][4]+mx[1]+degree-2);
cmax(ret,f[y][0]+mxf[4]+degree-2);
if(f[y][0]>mx[1]) mx[2]=mx[1],mx[1]=f[y][0];
else if(f[y][0]>mx[2]) mx[2]=f[y][0];
cmax(mxf[1],f[y][1]);
cmax(mxf[2],f[y][2]);
cmax(mxf[3],f[y][3]);
cmax(mxf[4],f[y][4]);
++j;
}
cmax(ans,ret+(fa?1:0));
}
void solve(){
n=read(); for(int i=1;i<=opt;++i) read(),read();
for(int i=1;i<n;++i){int x=read(),y=read();insert(x,y);insert(y,x);}
dp(1,0); printf("%d\n",ans);
len=ans=0;for(int i=1;i<=n;++i)Link[i]=0;
for(int i=1;i<=n;++i)for(int j=0;j<=4;++j)f[i][j]=0;
}
int main(){
T=read(); opt=read();
while(T--) solve();
return 0;
}