import sys import math #from collections import deque, defaultdict, Counter #import heapq #import bisect #import itertools #import functools # 外部ライブラリ(AtCoder環境で利用可能) #from sortedcontainers import SortedList, SortedSet, SortedDict #from atcoder.dsu import DSU #from atcoder.segtree import SegTree #from atcoder.lazysegtree import LazySegTree #from atcoder.fenwicktree import FenwickTree # 入力高速化 #input = sys.stdin.readline # 再帰回数上限 sys.setrecursionlimit(500000) # よくあるmod #MOD = 1000000007 MOD = 998244353 def solve(): # 解答ここから N = int(input()) S = list(map(int, input().split(' '))) G = {u: [] for u in range(N)} for _ in range(N-1): u, v = map(int, input().split(' ')) u-=1 v-=1 G[u].append(v) G[v].append(u) visited = [False] * N def dfs(u, ans): inc = 0 dec = 0 for v in G[u]: if visited[v]: continue visited[v] = True a, i, d = dfs(v, ans) ans = max(a, ans) if S[u] < S[v]: dec = max(dec, d + S[v]) elif S[u] > S[v]: inc = max(inc, i + S[v]) ans = max(ans, a) ans = max(ans, inc + dec + S[u]) return ans, inc, dec visited[0] = True print(dfs(0, 0)[0]) if __name__ == '__main__': T = 1 for _ in range(T): solve()