#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
using namespace std;
const int maxn = 500100, mod = 1e9 + 7, maxa = 1005, maxs = 820, maxb = 33,
          base = 737, base2 = 3079, mod3 = 1e7 + 19;
const long long inf = 2e14, infint = 1e9 + 11;
long long max(long long x, long long y) { return (x > y ? x : y); }
long long min(long long x, long long y) { return (x < y ? x : y); }
vector<int> v[maxn];
vector<pair<int, int> > mna[maxn];
vector<int> to[maxn];
vector<int> cmp;
int a[maxn];
int b[maxn];
int seg[4 * maxn];
int lazy[4 * maxn];
inline int ind(int x) {
  return int(upper_bound(cmp.begin(), cmp.end(), x) - cmp.begin());
}
inline void ok(int x) {
  sort(mna[x].begin(), mna[x].end());
  while (mna[x].size() > 2) {
    mna[x].pop_back();
  }
}
inline void dfs(int x, int p) {
  mna[x].push_back(make_pair(a[x], x));
  ok(x);
  to[mna[x][0].second].push_back(x);
  for (auto u : v[x]) {
    if (u != p) {
      mna[u] = mna[x];
      dfs(u, x);
    }
  }
}
inline void shift(int x) {
  lazy[2 * x] += lazy[x];
  lazy[2 * x + 1] += lazy[x];
  seg[2 * x] += lazy[x];
  seg[2 * x + 1] += lazy[x];
  lazy[x] = 0;
}
inline void update(int x, int l, int r, int s, int t, int val) {
  if (l >= s && r <= t) {
    seg[x] += val;
    lazy[x] += val;
    return;
  }
  shift(x);
  int mid = (l + r) / 2;
  if (s < mid) {
    update(2 * x, l, mid, s, min(mid, t), val);
  }
  if (t > mid) {
    update(2 * x + 1, mid, r, max(mid, s), t, val);
  }
  seg[x] = min(seg[2 * x], seg[2 * x + 1]);
}
inline int get() { return seg[1]; }
inline void add(int in, int val) { update(1, 0, maxn, 0, ind(in), val); }
inline bool check(int x, int val) {
  for (auto u : to[x]) {
    int mn2 = mna[u][1].first;
    add(mna[u][0].first, -1);
    add(min(mn2, val), 1);
  }
  bool res = (get() >= 0);
  for (auto u : to[x]) {
    int mn2 = mna[u][1].first;
    add(mna[u][0].first, 1);
    add(min(val, mn2), -1);
  }
  return res;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long n, k;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  cin >> k;
  for (int i = 0; i < k; i++) {
    cin >> b[i];
    cmp.push_back(b[i]);
  }
  sort(cmp.begin(), cmp.end());
  dfs(0, -1);
  mna[0].push_back(make_pair(infint, -1));
  for (int i = 0; i < k; i++) {
    add(b[i], -1);
  }
  for (int i = 0; i < n; i++) {
    add(mna[i][0].first, 1);
  }
  if (get() >= 0) {
    cout << 0 << endl;
    return 0;
  }
  long long ans = infint;
  for (int i = 0; i < n; i++) {
    int l = a[i], r = infint;
    if (!check(i, r)) {
      continue;
    }
    while (r - l > 1) {
      int mid = (l + r) / 2;
      if (check(i, mid)) {
        r = mid;
        continue;
      }
      l = mid;
    }
    ans = min(ans, r - a[i]);
  }
  if (ans >= infint) {
    cout << -1 << endl;
    return 0;
  }
  cout << ans << endl;
  return 0;
}
