#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 998244353
#define maxn 3010
inline ll read()
{
	ll x=0; char c=getchar(),f=1;
	for(;c<'0'||'9'<c;c=getchar())if(c=='-')f=-1;
	for(;'0'<=c&&c<='9';c=getchar())x=x*10+c-'0';
	return x*f;
}
inline void write(ll x)
{
	static char buf[20];
	int len=0;
	if(x<0)putchar('-'),x=-x;
	for(;x;x/=10)buf[len++]=x%10+'0';
	if(!len)putchar('0');
	else while(len)putchar(buf[--len]);
}
inline void writesp(ll x){write(x); putchar(' ');}
inline void writeln(ll x){write(x); putchar('\n');}
struct edge{
	int to,nxt;
}e[2*maxn];
int fir[maxn],val[maxn],size[maxn],cur[maxn];
struct Data{
	int cnt;
	ll val;
	friend bool operator < (const Data& a,const Data& b){return a.cnt!=b.cnt?a.cnt<b.cnt:a.val<b.val;}
	friend Data operator + (const Data& a,const Data& b){return (Data){a.cnt+b.cnt+(b.val>0),a.val};}
	friend Data operator | (const Data& a,const Data& b){return (Data){a.cnt+b.cnt,a.val+b.val};}
	friend Data max(const Data& a,const Data& b){return a<b?b:a;}
}init,f[2][maxn][maxn];
int n,m,tot;
inline void add_edge(int x,int y){e[tot].to=y; e[tot].nxt=fir[x]; fir[x]=tot++;}
void dp(int now,int fa)
{
	size[now]=1;
	for(int i=1;i<m;i++)
		f[0][now][i]=f[1][now][i]=init;
	f[0][now][0]=(Data){0,val[now]};
	cur[now]=0;
	for(int i=fir[now];~i;i=e[i].nxt)
		if(e[i].to!=fa){
			dp(e[i].to,now);
			for(int j=0;j<size[now]&&j<m;j++){
				for(int k=0;k<size[e[i].to]+size[now]&&k<m;k++)
					f[cur[now]^1][now][k]=init;
				for(int k=0;k<size[e[i].to]&&k<m-j;k++){
					f[cur[now]^1][now][j+k]=max(f[cur[now]^1][now][j+k],f[cur[now]][now][j]|f[cur[e[i].to]][e[i].to][k]);
					f[cur[now]^1][now][j+k+1]=max(f[cur[now]^1][now][j+k+1],f[cur[now]][now][j]+f[cur[e[i].to]][e[i].to][k]);
				}
				cur[now]^=1;
			}
			size[now]+=size[e[i].to];
		}
}
void work()
{
	n=read(); m=read();
	for(int i=1;i<=n;i++)
		val[i]=-read();
	for(int i=1;i<=n;i++)
		val[i]+=read();
	memset(fir,255,sizeof(fir)); tot=0;
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		add_edge(x,y); add_edge(y,x);
	}
	init={0,-(1ll<<40)};
	dp(1,-1);
	int ans=0;
	for(int i=0;i<m;i++)
		ans=std::max(ans,f[cur[1]][1][i].cnt+(f[cur[1]][1][i].val>0));
	writeln(ans);
	// for(int i=1;i<=n;i++)
	// 	for(int j=0;j<m;j++)
	// 		printf("%d %d : %d %lld\n",i,j,f[cur[i]][i][j],g[cur[i]][i][j]);
}
int main()
{
	int T=read();
	while(T--)work();
	return 0;
}