#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300002;
int n;
int padre[MAXN];
vector<pair<int, long long int> > adj[MAXN];
int w[MAXN];
long long int memo[MAXN];
bool vis[MAXN];
long long int singlePath(int nodo) {
  if (!vis[nodo]) {
    vis[nodo] = true;
    for (pair<int, long long int> h : adj[nodo]) {
      if (h.first == padre[nodo]) continue;
      memo[nodo] = max(memo[nodo], singlePath(h.first) - h.second);
    }
    memo[nodo] += w[nodo];
  }
  return memo[nodo];
}
long long int bestPath(int nodo = 1) {
  long long int firstSum = 0;
  long long int secondSum = 0;
  for (pair<int, long long int> h : adj[nodo]) {
    if (h.first == padre[nodo]) continue;
    if (singlePath(h.first) - h.second > secondSum) {
      secondSum = singlePath(h.first) - h.second;
      if (secondSum > firstSum) swap(firstSum, secondSum);
    }
  }
  long long int ans = firstSum + secondSum + w[nodo];
  for (pair<int, long long int> h : adj[nodo]) {
    if (h.first == padre[nodo]) continue;
    ans = max(ans, bestPath(h.first));
  }
  return ans;
}
void init(int nodo = 1) {
  for (pair<int, long long int> h : adj[nodo]) {
    if (h.first == padre[nodo]) continue;
    padre[h.first] = nodo;
    init(h.first);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; ++i) cin >> w[i];
  for (int i = 1; i < n; ++i) {
    int a, b;
    long long int p;
    cin >> a >> b >> p;
    adj[a].push_back({b, p});
    adj[b].push_back({a, p});
  }
  init();
  cout << bestPath() << "\n";
  return 0;
}
