#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
const int N = 6e5+50;
struct ss
{
int u,v,next;
};
ss edg[N*2];
int head[N],sum_edge=0;
void addedge(int u,int v)
{
edg[sum_edge]=(ss){u,v,head[u]};
head[u]=sum_edge++;
}
long long value[N];
long long ans=0;
long long dp[N][2];
void init(int n)
{
for(int i=0;i<=n;i++)
{
head[i]=-1;
dp[i][0]=dp[i][1]=0;
}
sum_edge=0;
ans=LLONG_MIN;
}
long long dfs1(int x,int fa,int type)
{
if(dp[x][type])return dp[x][type];
long long now= (type==0 ? LLONG_MIN : LLONG_MAX);
for(int i=head[x];i!=-1;i=edg[i].next)
{
int v=edg[i].v;
if(v==fa)continue;
if(type==0)now=max(now,dfs1(v,x,1)+value[x]);
else
now=min(now,dfs1(v,x,0)+value[x]);
}
return dp[x][type]=((now==LLONG_MAX||now==LLONG_MIN) ? value[x] : now);
}
long long dfs(int x,int fa,int type,long long last_ans)
{
// printf("%d %d %d %lld\n",x,fa,type,last_ans);
//printf("x=%d,fa=%d : %lld %lld value[%d]=%lld\n",x,fa,dfs1(x,fa,0),dfs1(x,fa,1),x,value[x]);
priority_queue<pair<long long,int> >q;
for(int i=head[x];i!=-1;i=edg[i].next)
{
int v=edg[i].v;
if(v==fa)continue;
if(type==0)q.push(make_pair(-dfs1(v,x,1),v));
else
q.push(make_pair(dfs1(v,x,0),v));
if(q.size()>2)q.pop();
}
pair<long long,int> first;
pair<long long,int> second;
if(q.size())
{
first=q.top();
q.pop();
// printf("%lld\n",first.first);
if(q.size())
{
second=q.top();
// printf("%lld\n",second.first);
q.pop();
}
else
{
second=first;
if(x!=1)first=make_pair(LLONG_MAX/2,-1);
else
first=make_pair(0,-1);
}
}
else
{
if(x!=1)second=make_pair(LLONG_MAX/2,-1);
else
second=make_pair(0,-1);
}
if(type==0)
{
for(int i=head[x];i!=-1;i=edg[i].next)
{
int v=edg[i].v;
if(v==fa)continue;
if(v==second.second)dfs(v,x,1,max(last_ans,-first.first)+value[x]);
else
dfs(v,x,1,max(last_ans,-second.first)+value[x]);
}
}
else
{
ans=max(ans,min(last_ans,second.first)+value[x]);
for(int i=head[x];i!=-1;i=edg[i].next)
{
int v=edg[i].v;
if(v==fa)continue;
if(v==second.second)dfs(v,x,0,min(last_ans,first.first)+value[x]);
else
dfs(v,x,0,min(last_ans,second.first)+value[x]);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
init(n);
for(int i=1;i<=n;i++)
scanf("%lld",&value[i]);
for(int i=1;i<=n;i++)
{
long long a;
scanf("%lld",&a);
value[i]-=a;
}
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d %d",&u,&v);
addedge(u,v);
addedge(v,u);
}
/* if(n<=2)
{
long long sum=0;
for(int i=1;i<=n;i++)sum+=value[i];
printf("%lld\n",sum);
continue;
}*/
dfs(1,-1,0,LLONG_MIN/2);
dfs(1,-1,1,LLONG_MAX/2);
printf("%lld\n",ans);
}
return 0;
}