#include<bits/stdc++.h>
using namespace std;
const int maxn=3e3+5;
typedef long long ll;
struct node{
	ll val;
	int num;
};
int cnt[maxn];
node dp[maxn][maxn];
vector<int>g[maxn];
int a[maxn],b[maxn];
void dfs1(int u,int fa){
	int r=g[u].size();
	cnt[u]=1;
	for(int i=0;i<r;i++){
		int v=g[u][i];
		if(v==fa) continue;
		dfs1(v,u);
		cnt[u]+=cnt[v];
	}
}
void dfs2(int u,int fa){
	int r=g[u].size();
	node tmp;
	tmp.val=b[u]-a[u];
	tmp.num=(tmp.val>0);
	for(int i=0;i<r;i++){
		int v=g[u][i];
		if(v==fa) continue;
		dfs2(v,u);
		for(int j=1;j<=cnt[v];j++){
			for(int k=j;k<=cnt[u];k++){
				if(dp[u][k-j].num+dp[v][j].num>dp[u][k].num||dp[u][k-j].num+dp[v][j].num==dp[u][k].num&&dp[u][k-j].val+dp[v][j].val>dp[u][k].val){
					dp[u][k].num=dp[u][k-j].num+dp[v][j].num;
					dp[u][k].val=dp[u][k-j].val+dp[v][j].val;
				}
				if(k==j) continue;
				if(dp[u][k-j-1].num+dp[v][j].num+tmp.num>dp[u][k].num
				||dp[u][k-j-1].num+dp[v][j].num+tmp.num==dp[u][k].num
				&&dp[u][k-j-1].val+dp[v][j].val+tmp.val>dp[u][k].val){
					dp[u][k].num=dp[u][k-j-1].num+dp[v][j].num+tmp.num;
					dp[u][k].val=dp[u][k-j-1].val+dp[v][j].val+tmp.val;
				}
			}
		}
	}
	if(dp[u][1].num<tmp.num||dp[u][1].num==tmp.num&&dp[u][1].val<tmp.val){
		dp[u][1]=tmp;
	}
}
int main(){
	int t,n,m,u,v;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		for(int i=1;i<=n;i++){
			scanf("%d",&b[i]);
		}
		for(int i=1;i<=n;i++){
			g[i].clear();
		}
		for(int i=1;i<n;i++){
			scanf("%d%d",&u,&v);
			g[u].push_back(v);
			g[v].push_back(u);
		}
		dfs1(1,-1);
		for(int i=1;i<=n;i++){
			for(int j=0;j<=cnt[i];j++){
				dp[i][j].num=0,dp[i][j].val=0;
			}
		}
		dfs2(1,-1);
		printf("%d\n",dp[1][m].num);
	}
} 