#include<bits/stdc++.h>
#define int long long
#define re register
#define inf 1e18
const int sz=3e6+5;
using namespace std;
int read()
{
char c=getchar();
int r=0,f=1;
while((c<'0'||c>'9')&&c!='-')
c=getchar();
if(c=='-') {
f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
r=r*10+c-'0';
c=getchar();
}
return f*r;
}
struct node
{
int nxt,to;
}e[sz];
int n,m,w[sz],b[sz],head[sz],cnt,siz[sz];
pair<int ,int > f[1005][1005];
pair<int ,int > tmp[sz];
void add_edge(int x,int y)
{
e[++cnt]=(node){head[x],y};
head[x]=cnt;
}
void dfs(int now,int fa)
{
f[now][1]=make_pair(0,w[now]-b[now]),siz[now]=1;
for(int i=head[now];i;i=e[i].nxt)
{
if(e[i].to==fa) continue;
dfs(e[i].to,now);
for(int j=1;j<=siz[now]+siz[e[i].to]&&j<=m;j++) tmp[j]=make_pair(0,-inf);
for(int j=1;j<=siz[now];j++)
for(int k=1;k<=siz[e[i].to];k++)
{
int fi=f[now][j].first+f[e[i].to][k].first;
if(f[e[i].to][k].second>0) fi++;
if(fi>tmp[j+k].first) tmp[j+k]=make_pair(fi,f[now][j].second);
else if(fi==tmp[j+k].first) tmp[j+k].second=max(tmp[j+k].second,f[now][j].second);
if(f[e[i].to][k].second>0) fi--;
if(fi>tmp[j+k-1].first) tmp[j+k-1]=make_pair(fi,f[now][j].second+f[e[i].to][k].second);
else if(fi==tmp[j+k-1].first) tmp[j+k-1].second=max(tmp[j+k-1].second,f[now][j].second+f[e[i].to][k].second);
}
siz[now]+=siz[e[i].to];
for(int j=1;j<=siz[now];j++) f[now][j]=tmp[j];
}
}
signed main()
{
int T=read();
while(T--)
{
int ans=0;
n=read(),m=read();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
f[i][j]=make_pair(0,-inf);
head[i]=0;
}
for(int i=1;i<=n;i++) b[i]=read();
for(int i=1;i<=n;i++) w[i]=read();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add_edge(u,v),add_edge(v,u);
}
dfs(1,1);
if(f[1][m].second>0) ans++;
ans+=f[1][m].first;
cout<<ans<<endl;
}
}
/*
4557430888798830399
*/