#include<bits/stdc++.h>
using namespace std;
#define sz(x) (int)x.size()
#define pb push_back
#define mp make_pair
#define ll long long 
#define lli long long
#define mod 1000000007
#define mod2 998244353
#define si size()
#define dou double
 
void fast(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
 
void init_code(){
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif 
}

long long binpow(long long a, long long b, long long m) {
    a %= m;
    long long res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a % m;
        a = a * a % m;
        b >>= 1;
    }
    return res;
}
const int mx=1e5+5;
ll int color[mx];
map<pair<ll int,ll int>,ll int> dp;
vector<int> adj[mx];
ll int in[mx];
ll inf=1e11;
long long dfs(ll int node,ll int col,ll int par){
    ll ans=0;
    if(dp[{node,col}]!=0){
      return dp[{node,col}];
    }
    
    
    for(int next:adj[node]){
        if(next!=par){
            
            ll minim=inf;
        if(color[next]!=-1){
            if(color[next]!=col){
          minim=min(dfs(next,color[next],node),minim);
            }
        }else{
            for(int i=1;i<=in[next]+1;i++){
                if(i!=col){
                minim=min(dfs(next,i,node),minim);
                }
            }
        }
        ans+=minim;
        //cout<<minim<<" "<<next<<"\n";
        }
        
    }
    ans+=col;
    
    return dp[{node,col}]=ans;
}

 
 
int main(){
  fast();
  init_code();
  int n;
  cin>>n;
  for(int i=0;i<n-1;i++){
    int a,b;
    cin>>a>>b;
    adj[a].pb(b);
    adj[b].pb(a);
    in[a]++;
    in[b]++;
  }
  for(ll int i=1;i<=n;i++){
    cin>>color[i];
  }
  
  ll an=inf;
  if(color[1]!=-1){
    an=min(dfs(1,color[1],-1),an);
  }else{
    for(int i=1;i<=in[i]+1;i++){
        an=min(dfs(1,i,-1),an);
    }
  }
  cout<<an<<"\n";

  
  
 
 
 
 
 
 
 
 
 
}