#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 300000 + 100;
typedef long long int ll;
vector <int> G[maxn],dist[maxn];
ll a[maxn],dp[maxn],dp_z[maxn];
ll ans = 0;
int u,v,w;
void dfs(int u, int fa)
{
//dp[u]把u当做起点
//dp_z[u]把u当做中间点
ll max1 = 0;//最大
ll max2 = 0;//次大
for(int i = 0; i <= G[u].size() - 1; i++)
{
int v = G[u][i];
if(v == fa)
{
continue;
}
dfs(v,u);
if(dp[v] - dist[u][i] > max1)
{
max2 = max1;
max1 = dp[v] - dist[u][i];
}
else if(dp[v] - dist[u][i] == max1)
{
max2 = max1;
}
else
{
if(dp[v] - dist[u][i] > max2)
{
max2 = dp[v] - dist[u][i];
}
}
}
dp_z[u] = a[u] + max1 + max2;
dp[u] = a[u] + max1;
ans = max(dp_z[u],ans);
ans = max(dp[u],ans);
}
int main()
{
int n;
while(cin >> n)
{
ans = 0;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
for(int i = 1; i <= n - 1; i++)
{
cin >> u >> v >> w;
G[u].push_back(v);
G[v].push_back(u);
dist[u].push_back(w);
dist[v].push_back(w);
}
dfs(1,-1);
cout << ans << endl;
}
return 0;
}