#include <bits/stdc++.h>

#define FAST ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define maxn 200005
#define pb push_back

using namespace std;

vector<int> adj[maxn];
int vrednosti[maxn];
vector<int> redosled;
int odozdo[maxn] = {};
int odozgo[maxn] = {};
int podstablo[maxn] = {};
int suma[maxn] = {};
int succ[maxn];
int ukupno[maxn];

void dfs(int u, int x){
    podstablo[u] = 1;
    suma[u] = vrednosti[u];
    odozdo[u] = 0;
    for(auto cvor : adj[u]){
        if(cvor != x){
            succ[cvor] = u;
            dfs(cvor, u);
            podstablo[u] += podstablo[cvor];
            suma[u] += suma[cvor];
            odozdo[u] += suma[cvor] + odozdo[cvor];
        }
    }
}
int processed[maxn] = {};
void bfs(int u){
    queue<int> red;
    red.push(u);
    while(!red.empty()){
        int x = red.front();
        redosled.pb(x);
        red.pop();
        processed[x] = 1;
        for(auto cvor : adj[x]){
            if(!processed[cvor])
                red.push(cvor);
        }
    }
}


int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n - 1; i++){
        int u, v;
        cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    for(int i = 1; i <= n; i++){
        cin >> vrednosti[i];
    }
    int q;
    cin >> q;
    if(q == 0){
        dfs(1, 0);
        bfs(1);
        ukupno[1] = odozdo[1];
        for(int i = 1; i < n; i++){
            odozgo[redosled[i]] = suma[1] - 2 * suma[redosled[i]] + ukupno[succ[redosled[i]]] - odozdo[redosled[i]];
            ukupno[redosled[i]] = odozgo[redosled[i]] + odozdo[redosled[i]];
        }
        int rez = 1, mini = ukupno[1];
        for(int i = 2; i <= n; i++){
            if(ukupno[i] < mini){
                rez = i;
                mini = ukupno[i];
            }
        }
        cout << rez << endl;
    }

    return 0;
}