#include <bits/stdc++.h>
using namespace std;
namespace IO {
const int N = 10000;
int pos = N;
char buf[N];
char read_char() {
  if (pos == N) fread(buf, 1, N, stdin), pos = 0;
  return buf[pos++];
}
int read_int() {
  char c;
  while (!isdigit(c = read_char()))
    ;
  int x = c - '0';
  while (isdigit(c = read_char())) x = 10 * x + c - '0';
  return x;
}
}  // namespace IO
const int N = 5e5 + 10, off = 1 << 20;
int H[N], S[N], T1[N], T2[N];
vector<int> adj[N], down[N];
struct Node {
  int sum, mn;
} tree[2 * off];
void Update(int at, int by) {
  at += off;
  tree[at].sum += by;
  tree[at].mn += by;
  for (at >>= 1; at > 0; at >>= 1) {
    tree[at].sum = tree[at * 2].sum + tree[2 * at + 1].sum;
    tree[at].mn = min(tree[at * 2].mn, tree[2 * at].sum + tree[2 * at + 1].mn);
  }
}
void dfs(int at, int from, int v, int m1, int m2) {
  if (v != -1) down[v].push_back(at);
  T1[at] = m1;
  T2[at] = m2;
  if (H[at] <= m1) {
    m2 = m1;
    m1 = H[at];
    v = at;
  } else if (H[at] <= m2) {
    m2 = H[at];
  }
  for (int to : adj[at]) {
    if (to != from) {
      dfs(to, at, v, m1, m2);
    }
  }
}
bool Check(int at, int h) {
  for (int to : down[at]) {
    int h1 = min(H[to], T1[to]);
    int h2 = min(H[to], min(h, T2[to]));
    if (h1 != h2) {
      Update(h1, 1);
      Update(h2, -1);
    }
  }
  Update(min(H[at], T1[at]), 1);
  Update(min(h, T1[at]), -1);
  bool ans = tree[1].mn >= 0;
  Update(min(H[at], T1[at]), -1);
  Update(min(h, T1[at]), 1);
  for (int to : down[at]) {
    int h1 = min(H[to], T1[to]);
    int h2 = min(H[to], min(h, T2[to]));
    if (h1 != h2) {
      Update(h1, -1);
      Update(h2, 1);
    }
  }
  return ans;
}
int main() {
  int n = IO::read_int();
  for (int _n(n), i(0); i < _n; i++) H[i] = IO::read_int();
  for (int _n(n - 1), i(0); i < _n; i++) {
    int a = IO::read_int() - 1;
    int b = IO::read_int() - 1;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  int k = IO::read_int();
  for (int _n(k), i(0); i < _n; i++) S[i] = IO::read_int();
  vector<int> v;
  for (int _n(n), i(0); i < _n; i++) {
    v.push_back(H[i]);
    v.push_back(S[i]);
  }
  sort((v).begin(), (v).end());
  for (int _n(n), i(0); i < _n; i++) {
    H[i] = int(lower_bound((v).begin(), (v).end(), H[i]) - v.begin());
    S[i] = int(lower_bound((v).begin(), (v).end(), S[i]) - v.begin());
  }
  dfs(0, -1, -1, 2 * n, 2 * n);
  for (int _n(n), i(0); i < _n; i++) {
    tree[off + S[i]].sum += 1;
    tree[off + S[i]].mn += 1;
    tree[off + min(H[i], T1[i])].sum -= 1;
    tree[off + min(H[i], T1[i])].mn -= 1;
  }
  for (int at = off - 1; at > 0; --at) {
    tree[at].sum = tree[at * 2].sum + tree[2 * at + 1].sum;
    tree[at].mn = min(tree[at * 2].mn, tree[2 * at].sum + tree[2 * at + 1].mn);
  }
  int ans = 1011111111;
  for (int _n(n), i(0); i < _n; i++) {
    int lo = H[i], hi = 2 * n;
    while (lo < hi) {
      int mid = (lo + hi) >> 1;
      Check(i, mid) ? hi = mid : lo = mid + 1;
    }
    if (lo < 2 * n) ans = min(ans, v[lo] - v[H[i]]);
  }
  cout << (ans < 1011111111 ? ans : -1) << endl;
  return 0;
}
