def main1(n,a,b,uv): if n==1: return max(a[0],0) ki=[[] for _ in range(n)] for u,v in uv: u,v=u-1,v-1 ki[u].append(v) ki[v].append(u) # 頂点vを消したときの最大値 # 頂点vを消さないときの最大値 tree_order=[] parent=[-1]*n todo=[[0,-1]] while todo: v,p=todo.pop() tree_order.append(v) parent[v]=p for nv in ki[v]: if nv==p:continue todo.append([nv,v]) tree_order.reverse() ary=[[] for _ in range(n)] # ary[v]:頂点vが子から遷移してきた値[子のidx,子を消すときの最大,子を消さないときの最大]の配列 ans=0 for v in tree_order: p=parent[v] if len(ary[v])==0: ary[p].append([v,a[v],0]) else: num1=a[v] # 頂点vを消す num2=0 # 頂点vを消さない for i,ai,bi in ary[v]: num1+=max(ai,bi) num2+=max(ai,bi+b[i]+b[v]) if p>=0: ary[p].append([v,num1,num2]) else: ans=max(num1,num2) return ans import sys input=sys.stdin.readline if __name__=='__main__': n=int(input()) a=list(map(int,input().split())) b=list(map(int,input().split())) uv=[list(map(int,input().split())) for _ in range(n-1)] ret1=main1(n,a,b,uv) print(ret1)