def main(): n = int(input()) node = [[] for _ in range(n)] for _ in range(n-1): u, v = list(map(lambda x: int(x)-1, input().split())) node[u].append(v) A = list(map(int, input().split())) D = [-1] * n E = [] D[0] = 0 S = [0] while S: u = S.pop() E.append(u) for v in node[u]: if D[v] == -1: D[v] = D[u]+1 S.append(v) inf = 1<<60 inf = float("INF") dp = [[0, 0, -inf, -inf] for _ in range(n)] for u in E[::-1]: dpu = dp[u] if A[u] == 1: for v in node[u]: if D[v] < D[u]: continue dpv = dp[v] if A[v] == A[u]: dpu[0] += dpv[0]+1 else: dpu[0] += max(dpv[0], dpv[2]+1) else: for v in node[u]: if D[v] < D[u]: continue dpv = dp[v] u0, u1, u2, u3 = dpu v0, v1, v2, v3 = dpv if A[v] == 1: dpu[0] += dpv[0] dpu[1] += dpv[0]+1 dpu[2] += dpv[0]+1 dpu[3] += dpv[0]+1 elif A[v] == A[u]: v2 = max(v2, v3) dpu[0] = u0+v0+1 dpu[1] = u1+v1+1 dpu[2] = max(u1+v2+1, u2+v1+1, u2+v2+1) dpu[3] = max(u3+v1+1, u3+v2+1) else: dpu[0] = u0+max(v0, v2, v3) dpu[1] = u1+max(v0, v2+1, v3+1) dpu[2] = u2+max(v0, v2+1, v3+1) dpu[3] = max(u3+v0, u3+v2+1, u1+v1+1, u1+v2+1) #print(dp) return max(dp[0][0], dp[0][2], dp[0][3]) print(main())