# ruff: noqa: E731, E741
from heapq import nlargest
import math
import sys
read = sys.stdin.readline
input = lambda: read().rstrip()
ir = lambda: int(read())
rir = lambda: range(int(read()))
mir = lambda: map(int, read().split())
lmir = lambda: list(map(int, read().split()))
def solve():
n = ir()
values = lmir()
tree = [dict() for _ in range(n)]
for _ in range(n - 1):
u, v, w = mir()
tree[u - 1][v - 1] = w
tree[v - 1][u - 1] = w
parents = [None] * n
depth = [-1] * n
depth[0] = 0
q = [0]
for i in q:
for j in tree[i]:
if depth[j] == -1:
parents[j] = i
depth[j] = depth[i] + 1
q.append(j)
branch_scores = [-math.inf] * n
branch_scores_no_self = [-math.inf] * n
full_scores = [-math.inf] * n
for i in reversed(q):
best_branch_score = -math.inf
best_branch_score_no_self = -math.inf
child_scores = []
for j, w in tree[i].items():
if j == parents[i]:
continue
best_branch_score = max(
best_branch_score,
branch_scores[j] + values[i] - 2 * w,
)
best_branch_score_no_self = max(
best_branch_score_no_self,
branch_scores_no_self[j] + values[i] - 2 * w,
)
child_scores.append(branch_scores[j] - 2 * w)
full_scores[i] = best_branch_score_no_self
if len(child_scores) >= 2:
c1, c2 = nlargest(2, child_scores)
full_scores[i] = max(full_scores[i], values[i] + c1 + c2)
branch_scores_no_self[i] = best_branch_score
branch_scores[i] = (
values[i]
if best_branch_score is None
else max(best_branch_score, values[i])
)
# print(branch_scores)
# print(full_scores)
print(max(full_scores))
# print(values)
def main():
for _ in rir():
solve()
def test():
pass
if __name__ == "__main__":
if sys.stdin.isatty():
test()
else:
main()