#include <bits/stdc++.h>
using namespace std;
struct mang {
  int val, id;
  mang() {}
  mang(int _val, int _id) : val(_val), id(_id) {}
  bool operator<(const mang &t) const { return val < t.val; }
};
vector<int> v[500005], roots, got;
int h[500005], a[500005], par[500005];
int eff[500005], cur[500005];
int st[500005 << 2], lz[500005 << 2];
void dfs_eff(int x) {
  got.push_back(eff[x]);
  for (typeof(v[x].begin()) ite = v[x].begin(); ite != v[x].end(); ite++)
    if (*ite != par[x]) {
      int y = *ite;
      par[y] = x;
      eff[y] = ((eff[x]) < (h[y]) ? (eff[x]) : (h[y]));
      dfs_eff(y);
    }
}
void upd(int i, int dau, int cuoi, int pos, int val) {
  if (dau == cuoi) {
    st[i] = val;
    return;
  }
  int i1 = i << 1, i2 = i1 | 1, giua = (dau + cuoi) >> 1;
  if (pos <= giua)
    upd(i1, dau, giua, pos, val);
  else
    upd(i2, giua + 1, cuoi, pos, val);
  st[i] = ((st[i1]) < (st[i2]) ? (st[i1]) : (st[i2]));
}
void upd(int sz, int pos, int val) { upd(1, 0, sz, pos, val); }
void upd(int i, int dau, int cuoi, int l, int r, int val) {
  if (r < dau || l > cuoi) return;
  if (dau == l && cuoi == r) {
    st[i] += val;
    lz[i] += val;
    return;
  }
  int i1 = i << 1, i2 = i1 | 1, giua = (dau + cuoi) >> 1;
  if (r <= giua)
    upd(i1, dau, giua, l, r, val);
  else if (l > giua)
    upd(i2, giua + 1, cuoi, l, r, val);
  else
    upd(i1, dau, giua, l, giua, val), upd(i2, giua + 1, cuoi, giua + 1, r, val);
  st[i] = ((st[i1]) < (st[i2]) ? (st[i1]) : (st[i2])) + lz[i];
}
void perform(int x, int sz) {
  int pos = upper_bound(a, a + sz, eff[x]) - a;
  upd(1, 0, sz - 1, 0, pos - 1, -1);
  pos = upper_bound(a, a + sz, cur[x]) - a;
  upd(1, 0, sz - 1, 0, pos - 1, 1);
  for (typeof(v[x].begin()) ite = v[x].begin(); ite != v[x].end(); ite++)
    if (*ite != par[x]) {
      int y = *ite;
      cur[y] = ((cur[x]) < (h[y]) ? (cur[x]) : (h[y]));
      perform(y, sz);
    }
}
void quailui(int x, int sz) {
  int pos = upper_bound(a, a + sz, eff[x]) - a;
  upd(1, 0, sz - 1, 0, pos - 1, 1);
  pos = upper_bound(a, a + sz, cur[x]) - a;
  upd(1, 0, sz - 1, 0, pos - 1, -1);
  for (typeof(v[x].begin()) ite = v[x].begin(); ite != v[x].end(); ite++)
    if (*ite != par[x]) quailui(*ite, sz);
}
void input() {
  int i, j, x, y, n, nq;
  priority_queue<mang> pq;
  scanf("%d", &n);
  for ((i) = (1); (i) <= (n); (i)++) scanf("%d", &h[i]);
  for ((i) = (2); (i) <= (n); (i)++) {
    scanf("%d %d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  scanf("%d", &nq);
  for ((i) = 0; (i) < (nq); (i)++) scanf("%d", &a[i]);
  sort(a, a + nq);
  eff[1] = h[1];
  pq.push(mang(eff[1], 1));
  par[1] = 1;
  for ((i) = (nq - 1); (i) >= 0; (i)--) {
    x = pq.top().id;
    if (eff[x] < a[i]) {
      while (!pq.empty()) {
        x = pq.top().id, pq.pop();
        roots.push_back(x);
        dfs_eff(x);
      }
      sort(got.begin(), got.end());
      int szgot = got.size();
      int sz = i + 1;
      int skip = 0;
      for ((j) = 0; (j) < (sz); (j)++) {
        while (skip < szgot && got[skip] < a[j]) skip++;
        upd(sz - 1, j, szgot - skip - (sz - j));
      }
      for (typeof(roots.begin()) ite = roots.begin(); ite != roots.end();
           ite++) {
        x = *ite;
        cur[x] = a[i];
        perform(x, sz);
        if (st[1] >= 0) {
          printf("%d", a[i] - h[x]);
          return;
        }
        quailui(x, sz);
      }
      printf("-1");
      return;
    }
    pq.pop();
    for (typeof(v[x].begin()) ite = v[x].begin(); ite != v[x].end(); ite++)
      if (*ite != par[x]) {
        y = *ite;
        par[y] = x;
        eff[y] = ((eff[x]) < (h[y]) ? (eff[x]) : (h[y]));
        pq.push(mang(eff[y], y));
      }
  }
  printf("0");
}
int main() {
  input();
  return 0;
}
