#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define X 0
#define Y 1
#define NO_PATH_VAL 999999

int n, q;
int (*port)[2];
int (*upiti)[2];
int *banke;
int *tmp_banke;
// int *br_pom_zl; //broj pomeranih zlatnika
int broj_pomeranja = 0;
int broj_pomeranja_kr = 0;
int *ista_mesta;
int im_br = 0;

void backtrc(int, int, bool, int, int);

int main()
{
    scanf("%d", &n);
    port = malloc((n - 1) * sizeof(int[2]));
    banke = malloc(n * sizeof(int));
    tmp_banke = malloc(n * sizeof(int));
    ista_mesta = calloc(n * 2, sizeof(int));

    for (int i = 0; i < n - 1; i++)
    {
        scanf("%d%d", &port[i][X], &port[i][Y]);
    }

    for (int i = 0; i < n; i++)
    {
        scanf("%d", banke + i);
    }

    scanf("%d", &q);
    upiti = malloc(q * sizeof(int[2]));

    for (int i = 0; i < q; i++)
    {
        scanf("%d%d", &upiti[i][0], &upiti[i][1]);
    }

    int *niz_za_min = malloc(n * sizeof(int));

    int max = banke[0], maxi = 0;

    for (int i = 1; i < n; i++)
        if (max < banke[i])
        {
            max = banke[i];
            maxi = i;
        }

    backtrc(maxi + 1, 1, false, 0, 0);

    printf("%d", broj_pomeranja_kr);
}

void backtrc(int do_koje_banke, int trenutna_banka, bool je_rekurzija, int brojac_poziva, int br_pom)
{
    if (!je_rekurzija) {
        broj_pomeranja = 0;
        broj_pomeranja_kr = 0;

        for (int i = 0; i < n; i++)
            tmp_banke[i] = banke[i];
    }

    if (brojac_poziva > n) {
        broj_pomeranja = NO_PATH_VAL;
        return;
    }

    if (trenutna_banka == do_koje_banke) {
        broj_pomeranja_kr += br_pom;
        broj_pomeranja_kr++;
        return;
    }

    bct:
    for (int i = 0, tmp; i < n - 1; i++)
    {
        for (int j = 0; j < im_br; j++)
        {
            if (trenutna_banka == ista_mesta[j]) {
                broj_pomeranja_kr -= tmp_banke[trenutna_banka - 1];
            }
        }

        if (trenutna_banka > n) { return; }
        bool nadjena = false;

        for (int j = 0; j < n - 1; j++)
        {
            if (trenutna_banka == port[j][X] || trenutna_banka == port[j][Y])
            {
                if ((trenutna_banka == port[j][X] ? port[j][Y] : port[j][X]) == do_koje_banke)
                {
                    nadjena = true;
                    tmp_banke[do_koje_banke - 1] += tmp_banke[trenutna_banka - 1];

                    tmp = tmp_banke[trenutna_banka - 1];
                    tmp_banke[trenutna_banka - 1] = 0;
                    backtrc(do_koje_banke, do_koje_banke, true, brojac_poziva + 1, tmp + br_pom);
                }
            }
        }

        if (!nadjena && (trenutna_banka == port[i][X] || trenutna_banka == port[i][Y])) {
            tmp_banke[trenutna_banka == port[i][X] ? port[i][Y] : port[i][X] - 1] += tmp_banke[trenutna_banka - 1];

            tmp = tmp_banke[trenutna_banka - 1];
            tmp_banke[trenutna_banka - 1] = 0;

            ista_mesta[im_br] = trenutna_banka;
            im_br++;
            ista_mesta[im_br] = (trenutna_banka == port[i][X] ? port[i][Y] : port[i][X]);
            im_br++;

            backtrc(do_koje_banke, trenutna_banka == port[i][X] ? port[i][Y] : port[i][X], true, brojac_poziva + 1, tmp + br_pom);
        }
    }

    if (!je_rekurzija) {
        trenutna_banka++;
        if (trenutna_banka == do_koje_banke)  trenutna_banka++;

        if (trenutna_banka > n)  return;

        goto bct;
    }
}