#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
#pragma GCC optimize("no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int N = 5e5 + 100, OO = 1e9 + 7, M = 998244353, P = 499122177, T = 2e3,
          SQ = 280, lg = 64, lg2 = 32;
vector<int> v[N], g[N];
int n, a[N], b[N], seg[N << 2], lazy[N << 2], k;
pair<int, int> mn[N];
bool cmp(int x, int y) { return a[mn[x].second] < a[mn[y].second]; }
void dfs(int x, int y) {
  for (auto u : v[x]) {
    if (u == y) continue;
    mn[u] = mn[x];
    if (a[u] <= a[mn[u].first])
      mn[u].second = mn[u].first, mn[u].first = u;
    else if (a[u] < a[mn[u].second])
      mn[u].second = u;
    dfs(u, x);
  }
}
void build(int c, int b, int e) {
  if (e - b == 1) {
    seg[c] = -(k - b);
    return;
  }
  int mid = (b + e) >> 1;
  build(c << 1, b, mid), build(c << 1 | 1, mid, e);
  seg[c] = min(seg[c << 1], seg[c << 1 | 1]);
}
void shift(int c) {
  seg[c << 1] += lazy[c], seg[c << 1 | 1] += lazy[c];
  lazy[c << 1] += lazy[c], lazy[c << 1 | 1] += lazy[c];
  lazy[c] = 0;
}
void upd(int c, int b, int e, int l, int r, int x) {
  if (e <= l || r <= b) return;
  if (l <= b && e <= r) {
    seg[c] += x;
    lazy[c] += x;
    return;
  }
  int mid = (b + e) >> 1;
  shift(c);
  upd(c << 1, b, mid, l, r, x), upd(c << 1 | 1, mid, e, l, r, x);
  seg[c] = min(seg[c << 1], seg[c << 1 | 1]);
}
int get(int c, int b, int e) {
  if (seg[c] >= 0) return 0;
  if (e - b == 1) return b;
  shift(c);
  int mid = (b + e) >> 1;
  if (seg[c << 1 | 1] < 0)
    return get(c << 1 | 1, mid, e);
  else
    return get(c << 1, b, mid);
}
int32_t main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  cin >> k;
  for (int i = 0; i < k; i++) cin >> b[i];
  sort(b, b + k);
  a[0] = OO;
  mn[1].first = 1;
  dfs(1, 0);
  build(1, 0, k);
  for (int i = 1; i <= n; i++) {
    g[mn[i].first].push_back(i);
    int t = upper_bound(b, b + k, a[mn[i].first]) - b;
    upd(1, 0, k, 0, t, +1);
  }
  if (seg[1] >= 0) return cout << 0, 0;
  int ans = OO;
  for (int i = 1; i <= n; i++) {
    if ((int)g[i].size() == 0) continue;
    sort(g[i].begin(), g[i].end(), cmp);
    int cnt = -1;
    for (auto u : g[i]) {
      int t = upper_bound(b, b + k, a[mn[u].first]) - b;
      upd(1, 0, k, 0, t, -1);
    }
    int h = 0;
    for (auto u : g[i]) {
      int t = upper_bound(b, b + k, a[mn[u].second]) - b;
      int r = get(1, 0, k);
      if (cnt == -1 && seg[1] + (int)g[i].size() - h >= 0 && r <= t) {
        cnt = b[r];
      }
      upd(1, 0, k, 0, t, +1);
      h++;
    }
    h = 0;
    for (auto u : g[i]) {
      int t = upper_bound(b, b + k, a[mn[u].second]) - b;
      upd(1, 0, k, 0, t, -1);
      t = upper_bound(b, b + k, a[mn[u].first]) - b;
      upd(1, 0, k, 0, t, +1);
    }
    if (cnt != -1) ans = min(ans, cnt - a[i]);
  }
  if (ans == OO) return cout << -1, 0;
  cout << ans << endl;
  return 0;
}
