#include<bits/stdc++.h>
using namespace std;
using pl=pair<long long,long long>;
using Graph=vector<vector<pl>>;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while(t>0){
t--;
long long n;
cin >> n;
vector<long long> a(n);
for(auto &nx : a){cin >> nx;}
Graph g(n);
for(long long i=1;i<n;i++){
long long u,v,w;
cin >> u >> v >> w;
u--; v--; w*=-2;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
queue<long long> q;
vector<long long> sq;
vector<long long> par(n,-1);
q.push(0);
par[0]=-2;
while(!q.empty()){
auto od=q.front(); q.pop();
sq.push_back(od);
for(auto &nx : g[od]){
if(par[nx.first]==-1){
par[nx.first]=od;
q.push(nx.first);
}
}
}
long long res=-8e18;
reverse(sq.begin(),sq.end());
// distinct path
{
vector<long long> dp(n,-8e18);
for(auto &v : sq){
vector<long long> mem;
for(auto &w : g[v]){
if(w.first==par[v]){continue;}
mem.push_back(dp[w.first]+w.second);
}
sort(mem.rbegin(),mem.rend());
if(mem.size()>=2){
res=max(res,mem[0]+mem[1]+a[v]);
}
dp[v]=0;
if(mem.size()>=1){
dp[v]=max(dp[v],mem[0]);
}
dp[v]+=a[v];
}
}
// parent-children
{
vector<vector<long long>> dp(n,vector<long long>(2,-8e18));
for(auto &v : sq){
for(auto &w : g[v]){
if(w.first==par[v]){continue;}
long long del=w.second+a[v];
res=max(res,dp[w.first][1]+del);
dp[v][1]=max(dp[v][1],max(dp[w.first][0],dp[w.first][1])+del);
}
dp[v][0]=a[v];
// cerr << v << " " << dp[v][0] << " " << dp[v][1] << "\n";
}
}
cout << res << "\n";
}
return 0;
}