package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func readInt(reader *bufio.Reader) int {
var n int
var c byte
var err error
for {
c, err = reader.ReadByte()
if err != nil {
return n
}
if c >= '0' && c <= '9' {
break
}
}
for {
n = n*10 + int(c-'0')
c, err = reader.ReadByte()
if err != nil || c < '0' || c > '9' {
break
}
}
return n
}
func main() {
reader := bufio.NewReaderSize(os.Stdin, 65536)
n := readInt(reader)
h := make([]int, n+1)
maxH := -1
root := -1
for i := 1; i <= n; i++ {
h[i] = readInt(reader)
if h[i] > maxH {
maxH = h[i]
root = i
}
}
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
u := readInt(reader)
v := readInt(reader)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
var totalSum int64
var dfs func(u, p int) int
dfs = func(u, p int) int {
var childVals []int
for _, v := range adj[u] {
if v != p {
childVals = append(childVals, dfs(v, u))
}
}
if len(childVals) == 0 {
return h[u]
}
maxVal := childVals[0]
maxIdx := 0
for i := 1; i < len(childVals); i++ {
if childVals[i] > maxVal {
maxVal = childVals[i]
maxIdx = i
}
}
for i, val := range childVals {
if i != maxIdx {
totalSum += int64(val)
}
}
if maxVal < h[u] {
maxVal = h[u]
}
return maxVal
}
var childVals []int
for _, v := range adj[root] {
childVals = append(childVals, dfs(v, root))
}
if len(childVals) == 0 {
totalSum += int64(h[root]) * 2
} else if len(childVals) == 1 {
totalSum += int64(h[root]) * 2
} else {
sort.Slice(childVals, func(i, j int) bool {
return childVals[i] > childVals[j]
})
totalSum += int64(h[root]) * 2
for i := 2; i < len(childVals); i++ {
totalSum += int64(childVals[i])
}
}
fmt.Println(totalSum)
}