#i nclude <iostream>
#i nclude <cstdio>
#i nclude <cstring>
#define maxn 105
#define sup ~0U>>2
using namespace std;
int next[2*maxn],v[2*maxn],first[maxn],n,m,ui,vi,N;
int a[maxn],b[maxn],f[maxn][2][2];
void addedge(int uu,int vv)
{
N++;
v[N]=vv;
next[N]=first[uu];
first[uu]=N;
}
void dfs(int now,int fa)
{
int sumA=0,sumB=0,minA=sup,minB=sup;
for (int i=first[now]; i!=-1; i=next[i])
{
if (v[i]==fa) continue;
int V=v[i];
dfs(V,now);
sumA+=min(f[V][0][0],f[V][1][1]);//如果V被A占领,那么叶子被A占领可以没有第一个入侵点,但如果被B占领的话一定包含第一个入侵的点。
sumB+=min(f[V][1][0],f[V][0][1]);
minA=min(minA,f[V][0][1]-min(f[V][0][0],f[V][1][1]));//第二个min的意思就是把那个部分多加的减出来,同时为保证最优性应该取最小
minB=min(minB,f[V][1][1]-min(f[V][1][0],f[V][0][1]));
}//这里不要考虑是否为最后一个叶子节点哦,看我前面的赋值就知道了。
f[now][0][0]=sumA+a[now]/2;
f[now][0][1]=sumA+min(a[now],a[now]/2+minA);//把A当做第一个入侵的点或者把A的叶子当做第一个入侵的点
f[now][1][0]=sumB+b[now]/2;
f[now][1][1]=sumB+min(b[now],b[now]/2+minB);
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
N=0;
memset(first,-1,sizeof first);
memset(f,0,sizeof f);
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++)
{
scanf("%d%d",&ui,&vi);
addedge(ui,vi);
addedge(vi,ui);
}
dfs(1,-1);
printf("%d\n",min(f[1][0][1],f[1][1][1]));//第一个点可能被A或B占领。
}
return 0;
}