package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int64 {
for idx < len(data) && data[idx] != '-' && (data[idx] < '0' || data[idx] > '9') {
idx++
}
sign := int64(1)
if data[idx] == '-' {
sign = -1
idx++
}
var num int64
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
num = num*10 + int64(data[idx]-'0')
idx++
}
return num * sign
}
n := int(nextInt())
g := make([][]int, n+1)
for i := 0; i < n-1; i++ {
a := int(nextInt())
b := int(nextInt())
g[a] = append(g[a], b)
g[b] = append(g[b], a)
}
val := make([]int64, n+1)
for i := 1; i <= n; i++ {
val[i] = nextInt()
}
parent := make([]int, n+1)
order := make([]int, 0, n)
stack := make([]int, 0, n)
stack = append(stack, 1)
parent[1] = -1
for len(stack) > 0 {
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]
order = append(order, v)
for _, to := range g[v] {
if to == parent[v] {
continue
}
parent[to] = v
stack = append(stack, to)
}
}
pos := make([]int64, n+1)
neg := make([]int64, n+1)
for i := len(order) - 1; i >= 0; i-- {
v := order[i]
var p, q int64
for _, to := range g[v] {
if to == parent[v] {
continue
}
if pos[to] > p {
p = pos[to]
}
if neg[to] > q {
q = neg[to]
}
}
x := val[v] + p - q
if x > 0 {
q += x
} else {
p += -x
}
pos[v] = p
neg[v] = q
}
out := bufio.NewWriter(os.Stdout)
fmt.Fprint(out, pos[1]+neg[1])
out.Flush()
}