#include <bits/stdc++.h>
using namespace std;
const int INF = 2000000000;
const int MAXN = 500011;
int min(int x, int y) { return x < y ? x : y; }
int max(int x, int y) { return x > y ? x : y; }
struct rangetree {
  int n;
  int val[4 * MAXN];
  int laz[4 * MAXN];
  void setval(int v, int x) { val[v] = x; }
  void setlaz(int v, int x) { laz[v] = x; }
  void init(int N) {
    n = N;
    init(1, 1, n);
  }
  void init(int v, int l, int r) {
    if (l == r) {
      setval(v, n + 1 - l);
      setlaz(v, 0);
      return;
    }
    int m = (l + r) / 2;
    init(2 * v, l, m);
    init(2 * v + 1, m + 1, r);
    setval(v, max(val[2 * v], val[2 * v + 1]));
    setlaz(v, 0);
  }
  void work(int v, int l, int r) {
    if (l == r) return;
    int m = (l + r) / 2;
    add(2 * v, l, m, l, m, laz[v]);
    add(2 * v + 1, m + 1, r, m + 1, r, laz[v]);
    setlaz(v, 0);
  }
  void add(int a, int b, int x) { add(1, 1, n, a, b, x); }
  void add(int v, int l, int r, int a, int b, int x) {
    if (r < a || l > b) return;
    if (a <= l && r <= b) {
      setval(v, val[v] + x);
      setlaz(v, laz[v] + x);
      return;
    }
    if (laz[v] != 0) work(v, l, r);
    int m = (l + r) / 2;
    add(2 * v, l, m, a, b, x);
    add(2 * v + 1, m + 1, r, a, b, x);
    setval(v, max(val[2 * v], val[2 * v + 1]));
  }
  int query() { return val[1]; }
};
int n;
int h[MAXN];
vector<int> adj[MAXN];
int par[MAXN];
int k;
int s[MAXN];
rangetree rt;
void dfs(int v, int p) {
  par[v] = p;
  for (int u : adj[v])
    if (p != u) dfs(u, v);
}
int mh[MAXN];
void regola(int v) {
  mh[v] = h[v];
  if (par[v] > 0 && mh[par[v]] < mh[v]) mh[v] = mh[par[v]];
  for (int u : adj[v])
    if (par[v] != u) regola(u);
}
void immetti(int v, int r) {
  int l = 0;
  while (l < r) {
    int m = (l + r + 1) / 2;
    if (s[m] > mh[v])
      r = m - 1;
    else
      l = m;
  }
  if (l) rt.add(1, l, -1);
  for (int u : adj[v])
    if (par[v] != u) immetti(u, r);
}
void togli(int v, int r) {
  int l = 0;
  while (l < r) {
    int m = (l + r + 1) / 2;
    if (s[m] > mh[v])
      r = m - 1;
    else
      l = m;
  }
  if (l) rt.add(1, l, 1);
  for (int u : adj[v])
    if (par[v] != u) togli(u, r);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> h[i];
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  cin >> k;
  for (int i = 1; i <= k; i++) cin >> s[i];
  sort(s + 1, s + k + 1);
  dfs(1, 0);
  priority_queue<pair<int, int> > pq;
  int r = k;
  int v = 1;
  pq.emplace(h[v], v);
  while (r && !pq.empty()) {
    int x, y;
    tie(y, x) = pq.top();
    if (y < s[r]) break;
    pq.pop();
    r--;
    for (int u : adj[x])
      if (u != par[x]) pq.emplace(h[u], u);
  }
  if (r == 0) {
    cout << 0 << endl;
    return 0;
  }
  rt.init(k);
  regola(1);
  immetti(1, k);
  rt.query();
  while (!pq.empty()) {
    int x, y;
    tie(y, x) = pq.top();
    pq.pop();
    togli(x, k);
    h[x] = s[r];
    regola(x);
    immetti(x, k);
    if (rt.query() <= 0) {
      cout << s[r] - y << endl;
      return 0;
    }
    togli(x, k);
    h[x] = y;
    regola(x);
    immetti(x, k);
  }
  cout << -1 << endl;
  return 0;
}
