#include <bits/stdc++.h>
using namespace std;
int n, par[((int)21 * 1000)], all, a[((int)21 * 1000)], b[((int)21 * 1000)],
    c[((int)21 * 1000)];
vector<pair<int, pair<int, int> > > ed;
int root(int x) {
  if (par[x] == -1) return x;
  return par[x] = root(par[x]);
}
bool check(int x) {
  memset(par, -1, sizeof par);
  for (auto q : ed) {
    if (q.first >= x) break;
    par[root(q.second.first)] = root(q.second.second);
  }
  memset(b, 0, sizeof b);
  memset(c, 0, sizeof c);
  for (int i = 1; i <= n; i++) b[root(i)]++, c[root(i)] += a[i];
  for (int i = 1; i <= n; i++)
    if (par[i] == -1 && all - c[i] < b[i]) return 0;
  return 1;
}
int main() {
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int v, u, w;
    cin >> v >> u >> w;
    ed.push_back({w, {v, u}});
  }
  for (int i = 1; i <= n; i++) cin >> a[i], all += a[i];
  sort(ed.begin(), ed.end());
  int l = 0, r = 20 * 1000;
  while (l < r - 1) {
    int mid = l + r >> 1;
    if (check(mid))
      l = mid;
    else
      r = mid;
  }
  cout << l;
  return 0;
}
