#include <bits/stdc++.h>
using namespace std;
int pa[5009], siz[5009], occ[5009], tots = 0;
bool yay;
vector<pair<int, pair<int, int> > > edges;
int finder(int node) {
  if (pa[node] != node) {
    return pa[node] = finder(pa[node]);
  }
  return node;
}
void uniter(int x, int y) {
  x = finder(x);
  y = finder(y);
  if (x == y) {
    return;
  }
  pa[y] = x;
  siz[x] += siz[y];
  occ[x] += occ[y];
  if (tots - occ[x] < siz[x]) {
    yay = false;
  }
  return;
}
int main() {
  int i, j, t1, t2, t3, t4, n, ans = 0;
  scanf("%d", &n);
  for (i = 0; i < n - 1; i++) {
    scanf("%d %d %d", &t1, &t2, &t3);
    edges.push_back(make_pair(t3, make_pair(t1, t2)));
  }
  sort(edges.begin(), edges.end());
  for (i = 1; i <= n; i++) {
    pa[i] = i;
    siz[i] = 1;
    scanf("%d", &occ[i]);
    tots += occ[i];
  }
  if (n == 1) {
    printf("0\n");
    return 0;
  }
  ans = edges[0].first;
  yay = true;
  for (i = 0; i < n - 1;) {
    j = i;
    while (edges[i].first == edges[j].first && j < n - 1) {
      uniter(edges[j].second.first, edges[j].second.second);
      j++;
    }
    if (yay && j < n - 1) {
      ans = edges[j].first;
    }
    i = j;
  }
  printf("%d\n", ans);
  return 0;
}
