#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  x = 0;
  int c = getchar(), f = 1;
  for (; !isdigit(c); c = getchar())
    if (c == 45) f = -1;
  for (; isdigit(c); c = getchar()) (x *= 10) += f * (c - '0');
}
int n, m, p = 1, mx, h[500000 + 5], s[500000 + 5];
vector<int> G[500000 + 5], lft;
pair<int, int> mi[500000 + 5];
void addedge(int u, int v) { G[u].push_back(v), G[v].push_back(u); }
bool cmpi(const int &a, const int &b) { return a > b; }
bool cmpp(const pair<int, int> &a, const pair<int, int> &b) {
  if (h[a.first] ^ h[b.first])
    return h[a.first] > h[b.first];
  else if (a.first ^ b.first)
    return a.first < b.first;
  else
    return h[a.second] > h[b.second];
}
void DFS(int u, int fa, int mi1, int mi2) {
  if (h[u] < h[mi1])
    mi2 = mi1, mi1 = u;
  else if (h[u] < h[mi2])
    mi2 = u;
  mi[u] = pair<int, int>(mi1, mi2);
  for (int i = 0, v; i < (int)G[u].size(); i++)
    if ((v = G[u][i]) ^ fa) DFS(v, u, mi1, mi2);
}
bool chk(int l, int r) {
  int ret = 0;
  for (int i = 0, ts; i < r - l + 1; i++) {
    ts = i < (int)lft.size() ? lft[i] : s[p + i - (int)lft.size()];
    ret = max(ret, ts - h[mi[l].first]);
    if (ts > h[mi[l + i].second]) return false;
  }
  return printf("%d\n", ret), true;
}
int main() {
  read(n), h[0] = 0x3f3f3f3f;
  for (int i = 1; i <= n; i++) read(h[i]);
  for (int i = 1, u, v; i < n; i++) read(u), read(v), addedge(u, v);
  read(m), DFS(1, 0, 0, 0);
  for (int i = 1; i <= m; i++) read(s[i]);
  sort(s + 1, s + n + 1, cmpi), sort(mi + 1, mi + n + 1, cmpp);
  for (int i = 1; i <= n; i++)
    if (s[i] > h[mi[i].first]) mx = i;
  if (!mx) return puts("0"), 0;
  for (int l = 1, r = 1; r <= n; l = ++r) {
    for (; r < n && mi[l].first == mi[r + 1].first;) r++;
    if ((int)lft.size() <= r - l + 1 && r >= mx)
      if (chk(l, r)) return 0;
    for (int i = l; i <= r; i++) {
      while (p <= m && s[p] > h[mi[i].first]) lft.push_back(s[p]), p++;
      p = min(p + 1, m + 1);
    }
  }
  return puts("-1"), 0;
}
