/*If we keep holding onto yesterday, what are we going to be tomorrow?*/
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200005;
vector<array<long long, 2>>g[N];
long long d[N], w[N], ryo[N];
long long ans = -(1ll << 60);
map<pair<int, int>, bool>mp;
set<pair<long long, int>>st[N];
void dfs(int u, int p) {
st[u].insert({d[u], u});
for(auto [v, wt] : g[u]) {
if(v == p) continue;
d[v] = d[u] - 2ll * wt + w[v];
dfs(v, u);
for(auto [a, _u] : st[u]) {
for(auto [b, _v] : st[u]) {
if(_u == _v) continue;
if(mp.find({_u, _v}) != mp.end()) continue;
long long ret = a + b - 2ll * d[u] + w[u];
ans = max(ans, ret);
}
}
for(auto [x, y] : st[v]) {
st[u].insert({x, y});
}
while(st[u].size() > 4) {
st[u].erase(st[u].begin());
}
}
while(st[u].size() > 4) {
st[u].erase(st[u].begin());
}
for(auto [a, _u] : st[u]) {
for(auto [b, _v] : st[u]) {
if(_u == _v) continue;
if(mp.find({_u, _v}) != mp.end()) continue;
long long ret = a + b - 2ll * d[u] + w[u];
ans = max(ans, ret);
}
}
}
void solve() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) g[i].clear();
for(int i = 1; i <= n; i++) {
cin >> w[i];
}
mp.clear();
d[1] = w[1];
for(int i = 0; i < n - 1; i++) {
int u, v, wt;
cin >> u >> v >> wt;
mp[{u, v}] = 1;
mp[{v, u}] = 1;
g[u].push_back({v, wt});
g[v].push_back({u, wt});
}
ans = -(1ll << 60);
dfs(1, 0);
cout << ans << '\n';
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
cin >> t;
while(t--){
solve();
}
return 0;
}