#include <iostream>


using namespace std;
bool povezan [1001][1001];
int put(int pocetni_cvor, int krajnji_cvor, int broj_cvorova){
bool gotov[broj_cvorova+1];
int d[broj_cvorova+1];
    for(int i = 0; i<broj_cvorova+1; i++){
        d[i] = 9999999;
        gotov[i] = false;
    }
    d[pocetni_cvor] = 0;
    for(int i = 1; i<broj_cvorova+1; i++){
        if(povezan[pocetni_cvor][i]){
            d[i] = 1;
        }
    }
    gotov[pocetni_cvor] = true;
    while(true){
        int minimal = 9999999;
        int index = -1;
        for(int i = 1; i<broj_cvorova+1; i++){
            if(!gotov[i]&&d[i]<minimal){
                minimal = d[i];
                index = i;
            }
        }
        if(index==-1){
            break;
        }
        for(int i = 1; i<broj_cvorova+1; i++){
            if(povezan[index][i] && d[i]>d[index]+1){
                d[i] = d[index]+1;
            }
        }
        gotov[index] = true;
    }
    return d[krajnji_cvor];
}




int main()
{
    int N;
    cin>>N;
    for(int i=0; i<N+1; i++){
        for(int j=0; j<N+1; j++){
            povezan[i][j]=false;
        }
    }
    int x,y;
    for(int i=1; i<N; i++){
        cin>>x;
        cin>>y;
        povezan[x][y]=true;
        povezan[y][x]=true;
    }
    int pocetni_broj_zlatnika[N+1];
    for(int i=1; i<N+1; i++){
        cin>>pocetni_broj_zlatnika[i];
    }
    int Q;
    cin>>Q;
    for(int i=0; i<Q; i++){
        cin>>x;
        cin>>y;
    }
    int dobrobit_banke[N+1];
    for(int i=1; i<N+1; i++){
        dobrobit_banke[i]=0;
        for(int j=1;j<N+1; j++){
            if(j!=i){
                dobrobit_banke[i]=dobrobit_banke[i]+pocetni_broj_zlatnika[j]*put(i,j,N);
            }
        }
    }
    int minimalacc=999999999;
    int index_najbolje_banke;
    for(int i=1; i<N+1; i++){
        if(dobrobit_banke[i]<minimalacc){
            minimalacc=dobrobit_banke[i];
            index_najbolje_banke=i;
        }
    }
    cout<<index_najbolje_banke;

    return 0;
}