#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') ch = getchar();
  while ('0' <= ch && ch <= '9')
    x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
  return x;
}
const int N = 5e5 + 5;
vector<int> vec[N];
int cnt, head[N], Mn_pos[N], zx[N], cx[N], n, u, v, m, Min[N << 3], tag[N << 3],
    s[N], h[N], k, t, ans, tot, b[N * 2];
const int inf = 0x3f3f3f3f;
struct node {
  int to, next;
} num[N * 2];
void add(int x, int y) {
  num[++cnt].to = y;
  num[cnt].next = head[x];
  head[x] = cnt;
}
void dfs(int x, int fa) {
  zx[x] = zx[fa];
  cx[x] = cx[fa];
  Mn_pos[x] = Mn_pos[fa];
  if (h[x] < zx[x])
    cx[x] = zx[x], zx[x] = h[x], Mn_pos[x] = x;
  else if (h[x] < cx[x])
    cx[x] = h[x];
  vec[Mn_pos[x]].push_back(x);
  for (int i = head[x]; i; i = num[i].next)
    if (num[i].to != fa) dfs(num[i].to, x);
}
void down(int k) {
  if (tag[k]) {
    tag[k << 1] += tag[k];
    tag[k << 1 | 1] += tag[k];
    Min[k << 1] += tag[k];
    Min[k << 1 | 1] += tag[k];
    tag[k] = 0;
  }
}
void ins(int k, int l, int r, int R, int y) {
  if (r <= R) {
    Min[k] += y;
    tag[k] += y;
    return;
  }
  down(k);
  if (R > ((l + r) >> 1)) ins(k << 1 | 1, ((l + r) >> 1) + 1, r, R, y);
  ins(k << 1, l, ((l + r) >> 1), R, y);
  Min[k] = min(Min[k << 1], Min[k << 1 | 1]);
}
int Find(int k, int l, int r) {
  if (l == r) return l;
  down(k);
  if (Min[k << 1 | 1] < 0)
    return Find(k << 1 | 1, ((l + r) >> 1) + 1, r);
  else
    return Find(k << 1, l, ((l + r) >> 1));
}
void solve(int x, int fa) {
  if (b[h[x]] < b[k]) {
    for (int i = 0; i < vec[x].size(); i++)
      t = vec[x][i], ins(1, 1, tot, zx[t], -1),
      ins(1, 1, tot, min(cx[t], k), 1);
    if (Min[1] >= 0) ans = min(ans, b[k] - b[h[x]]);
    for (int i = 0; i < vec[x].size(); i++)
      t = vec[x][i], ins(1, 1, tot, zx[t], 1),
      ins(1, 1, tot, min(cx[t], k), -1);
  }
  for (int i = head[x]; i; i = num[i].next)
    if (num[i].to != fa) solve(num[i].to, x);
}
int main() {
  n = read();
  Min[0] = zx[0] = cx[0] = inf;
  for (int i = 1; i <= n; i++) h[i] = b[++tot] = read();
  for (int i = 1; i < n; i++) u = read(), v = read(), add(u, v), add(v, u);
  m = read();
  for (int i = 1; i <= m; i++) s[i] = b[++tot] = read();
  sort(b + 1, b + tot + 1);
  tot = unique(b + 1, b + tot + 1) - b - 1;
  for (int i = 1; i <= n; i++)
    h[i] = lower_bound(b + 1, b + tot + 1, h[i]) - b,
    s[i] = lower_bound(b + 1, b + tot + 1, s[i]) - b;
  dfs(1, 0);
  for (int i = 1; i <= n; i++)
    ins(1, 1, tot, s[i], -1), ins(1, 1, tot, zx[i], 1);
  if (Min[1] >= 0) return puts("0"), 0;
  ans = inf;
  k = Find(1, 1, tot);
  solve(1, -1);
  printf("%d\n", ans == inf ? -1 : ans);
  return 0;
}
