#!/usr/bin/env pypy3 __import__("sys").setrecursionlimit(10**6) INF = 10**9 n = int(input()) g = [[] for _ in range(n)] for i in range(n-1): u, v = map(int, input().split()) u -= 1 v -= 1 g[u].append(v) g[v].append(u) a = list(map(int, input().split())) dp = [[INF for _ in range(4)] for _ in range(n)] def dfs(u, p): global dp cur = [INF for _ in range(4)] if a[u] == 1: cur[3] = 0 else: cur[0] = cur[1] = 0 for v in g[u]: if v == p: continue dfs(v, u) nxt = [INF for _ in range(4)] mn = INF for i in [0,2,3]: mn = min(mn, dp[v][i] + 1) for i in range(4): nxt[i] = min(nxt[i], cur[i] + mn) if a[u] == 1 and a[v] == 1: nxt[3] = min(nxt[3], cur[3] + dp[v][3]) elif a[u] == 1: nxt[3] = min(nxt[3], cur[3] + dp[v][3]) nxt[3] = min(nxt[3], cur[3] + dp[v][2]) elif a[v] == 1: nxt[1] = min(nxt[1], cur[0] + dp[v][3]) nxt[1] = min(nxt[1], cur[1] + dp[v][3]) nxt[2] = min(nxt[2], cur[2] + dp[v][3]) nxt[3] = min(nxt[3], cur[3] + dp[v][3]) elif a[u] == a[v]: nxt[0] = min(nxt[0], cur[0] + dp[v][0]) for i in [0,1]: for j in [0,1]: nxt[1] = min(nxt[1], cur[i] + dp[v][j]) for i in [0,1]: for j in [2,3]: nxt[2] = min(nxt[2], cur[i] + dp[v][j]) for i in [2,3]: for j in [0,1,2,3]: nxt[i] = min(nxt[i], cur[i] + dp[v][j]) else: for i in [0,1,2,3]: for j in [2,3]: k = 1 if i == 0 else i nxt[k] = min(nxt[k], cur[i] + dp[v][j]) for i in [0,1,2]: for j in [0,1,2]: nxt[3] = min(nxt[3], cur[i] + dp[v][j]) for i in range(4): cur[i] = nxt[i] for i in range(4): dp[u][i] = cur[i] dfs(0, -1) cuts = n for i in [0,2,3]: cuts = min(cuts, dp[0][i]) print(n-1-cuts)