#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6, inf = 1e9;
int h[MAXN], e[MAXN], s[MAXN], v[MAXN], par[MAXN], N, K, n;
vector<int> g[MAXN];
int t[4 * MAXN], lazy[4 * MAXN];
void unlazy(int n) {
  t[n] += lazy[n];
  lazy[2 * n] += lazy[n];
  lazy[2 * n + 1] += lazy[n];
  lazy[n] = 0;
}
void add(int x, int i, int j, int n = 1, int lo = 1, int hi = N) {
  unlazy(n);
  if (hi < i || lo > j) return;
  if (lo >= i && hi <= j) {
    lazy[n] += x;
    unlazy(n);
    return;
  }
  add(x, i, j, 2 * n, lo, (lo + hi) / 2);
  add(x, i, j, 2 * n + 1, (lo + hi) / 2 + 1, hi);
  t[n] = min(t[2 * n], t[2 * n + 1]);
}
int query(int i, int j, int n = 1, int lo = 1, int hi = N) {
  unlazy(n);
  if (hi < i || lo > j) return inf;
  if (lo >= i && hi <= j) return t[n];
  return min(query(i, j, 2 * n, lo, (lo + hi) / 2),
             query(i, j, 2 * n + 1, (lo + hi) / 2 + 1, hi));
}
int find(int x) { return upper_bound(s + 1, s + N + 1, x) - s - 1; }
void upd(int x, int p) {
  if (!par[x]) par[x] = p;
  add(-1, 1, find(e[x]));
  e[x] = min(e[p], h[x]);
  add(1, 1, find(e[x]));
  for (int y : g[x])
    if (y != p) upd(y, x);
}
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d", &h[i]);
  for (int i = 1, x, y; i <= N - 1; i++) {
    scanf("%d%d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  scanf("%d", &K);
  for (int i = 1; i <= K; ++i) scanf("%d", &s[i]);
  n = N;
  sort(s + 1, s + N + 1);
  priority_queue<pair<int, int> > q;
  q.push({h[1], 1});
  while (q.size()) {
    if (s[n] > q.top().first) break;
    pair<int, int> u = q.top();
    q.pop();
    v[u.second] = 1;
    n--;
    for (int x : g[u.second])
      if (!v[x]) q.push({min(u.first, h[x]), x});
  }
  if (!q.size()) {
    puts("0");
    return 0;
  }
  memset(e, -1, sizeof(e));
  e[0] = 1e9;
  upd(1, 0);
  for (int i = 1; i <= N; i++) add(i - N, i, i);
  while (q.size()) {
    int x = q.top().second;
    q.pop();
    int old = h[x];
    h[x] = s[n];
    upd(x, par[x]);
    if (query(1, N) > 0) {
      printf("%d\n", h[x] - old);
      return 0;
    }
    h[x] = old;
    upd(x, par[x]);
  }
  puts("-1");
}
