#include <bits/stdc++.h>
using namespace std;
const int inf = (int)2e9;
struct ww {
  int mi, s;
} tr[1000010 * 4];
int i, j, k, n, m, t, an;
int h[1000010], li[1000010], zhi[1000010], fa[1000010], id[1000010], s[1000010];
vector<int> a[1000010];
map<int, int> b[1000010];
inline void read(int &x) {
  char p = getchar();
  for (; p < '0' || p > '9'; p = getchar())
    ;
  for (x = 0; p >= '0' && p <= '9'; x = x * 10 + p - 48, p = getchar())
    ;
}
inline void update(int x) {
  int y = x * 2, z = x * 2 + 1;
  tr[x].s = tr[y].s + tr[z].s;
  tr[x].mi = min(tr[z].mi, tr[z].s + tr[y].mi);
}
void into(int q, int x, int y, int k, int v) {
  if (x == y) {
    tr[q].mi += v, tr[q].s += v;
    return;
  }
  int mid = (x + y) / 2;
  if (k <= mid)
    into(q * 2, x, mid, k, v);
  else
    into(q * 2 + 1, mid + 1, y, k, v);
  update(q);
}
int suan(int q, int x, int y, int zhi) {
  if (x == y) return x;
  int mid = (x + y) / 2;
  if (tr[q * 2 + 1].mi + zhi >= 0)
    return suan(q * 2, x, mid, zhi + tr[q * 2 + 1].s);
  else
    return suan(q * 2 + 1, mid + 1, y, zhi);
}
void dfs(int x) {
  for (auto i : a[x]) {
    if (i == fa[x]) continue;
    fa[i] = x;
    zhi[i] = min(zhi[x], zhi[i]);
    dfs(i);
  }
}
inline int find(int x) { return lower_bound(li + 1, li + t + 1, x) - li; }
inline void jia(int x, int y) {
  int A = find(x);
  into(1, 1, t, A, y);
}
inline void mer(int &x, int y) {
  if (b[x].size() < b[y].size()) swap(x, y);
  for (auto i : b[y]) b[x][i.first] += i.second;
}
inline void work(int x) {
  b[id[x]][h[x]] += 1;
  map<int, int>::iterator qi, i;
  if (zhi[x] != zhi[fa[x]]) {
    int ma = zhi[fa[x]], f = 0, last = find(h[x]), ge = 1;
    if (!b[id[x]].count(ma)) b[id[x]][ma] = 0;
    qi = b[id[x]].lower_bound(h[x] + 1);
    for (i = qi; i != b[id[x]].end(); i++) ge += i->second;
    jia(h[x], -ge);
    for (i = qi; i != b[id[x]].end(); i++) {
      int A = min(i->first, ma), now = find(A);
      jia(A, ge);
      if (!f && tr[1].mi >= 0) {
        f = 1;
        jia(A, -ge);
        int wei = suan(1, 1, t, 0);
        an = min(an, li[wei] - h[x]);
        jia(A, ge);
      }
      jia(A, -ge);
      ge -= i->second;
      jia(A, i->second);
      last = now;
    }
    jia(h[x], ge);
    for (i = qi; i != b[id[x]].end(); i++) {
      int A = min(i->first, ma);
      jia(h[x], i->second);
      jia(A, -i->second);
    }
  }
  for (;;) {
    i = b[id[x]].end();
    i--;
    if (i->first <= h[x]) break;
    b[id[x]][h[x]] += i->second;
    b[id[x]].erase(i);
  }
}
void Dfs(int x) {
  for (auto i : a[x]) {
    if (i == fa[x]) continue;
    Dfs(i);
    mer(id[x], id[i]);
  }
  work(x);
}
int main() {
  scanf("%d", &n);
  for (i = 1; i <= n; i++) read(h[i]), li[++t] = zhi[i] = h[i], id[i] = i;
  for (i = 1; i <= n - 1; i++) {
    int x, y;
    read(x), read(y);
    a[x].push_back(y);
    a[y].push_back(x);
  }
  scanf("%d", &m);
  for (i = 1; i <= m; i++) scanf("%d", &s[i]), li[++t] = s[i];
  sort(s + 1, s + m + 1);
  sort(li + 1, li + t + 1);
  for (i = 1; i <= m; i++) jia(s[i], -1);
  dfs(1);
  for (i = 1; i <= n; i++) jia(zhi[i], 1);
  if (tr[1].mi >= 0) {
    printf("0\n");
    return 0;
  }
  zhi[0] = li[t], an = inf;
  Dfs(1);
  printf("%d\n", an == inf ? -1 : an);
  return 0;
}
