package main
import (
"io"
"os"
"strconv"
)
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
readInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
n := readInt()
q := readInt()
a := make([]int64, n+1)
for i := 1; i <= n; i++ {
a[i] = int64(readInt())
}
m := n - 1
head := make([]int, n+1)
for i := 0; i <= n; i++ {
head[i] = -1
}
to := make([]int, 2*m)
nxt := make([]int, 2*m)
w := make([]int64, 2*m)
ec := 0
addEdge := func(u, v int, ww int64) {
to[ec] = v
w[ec] = ww
nxt[ec] = head[u]
head[u] = ec
ec++
}
for i := 0; i < m; i++ {
u := readInt()
v := readInt()
ww := int64(readInt())
addEdge(u, v, ww)
addEdge(v, u, ww)
}
LOG := 1
for (1 << LOG) <= n {
LOG++
}
up := make([][]int, LOG)
for i := 0; i < LOG; i++ {
up[i] = make([]int, n+1)
}
parent := make([]int, n+1)
depth := make([]int, n+1)
parentW := make([]int64, n+1)
order := make([]int, 0, n)
stack := make([]int, 0, n)
stack = append(stack, 1)
for len(stack) > 0 {
x := stack[len(stack)-1]
stack = stack[:len(stack)-1]
order = append(order, x)
for e := head[x]; e != -1; e = nxt[e] {
y := to[e]
if y == parent[x] {
continue
}
parent[y] = x
depth[y] = depth[x] + 1
parentW[y] = w[e]
up[0][y] = x
for k := 1; k < LOG; k++ {
up[k][y] = up[k-1][up[k-1][y]]
}
stack = append(stack, y)
}
}
sumChildPos := make([]int64, n+1)
posToParent := make([]int64, n+1)
for i := len(order) - 1; i >= 0; i-- {
x := order[i]
var sum int64
for e := head[x]; e != -1; e = nxt[e] {
y := to[e]
if parent[y] == x {
sum += posToParent[y]
}
}
sumChildPos[x] = sum
if x != 1 {
v := a[x] - 2*parentW[x] + sum
if v > 0 {
posToParent[x] = v
}
}
}
C := make([]int64, n+1)
pref := make([]int64, n+1)
C[1] = a[1] + sumChildPos[1]
pref[1] = C[1]
for _, x := range order {
for e := head[x]; e != -1; e = nxt[e] {
y := to[e]
if parent[y] != x {
continue
}
base := a[y] + sumChildPos[y]
raw := C[x] - 2*w[e] - posToParent[y]
if raw < 0 {
raw = 0
}
C[y] = base + raw
pref[y] = pref[x] + base - w[e] - posToParent[y]
}
}
lca := func(u, v int) int {
if depth[u] < depth[v] {
u, v = v, u
}
diff := depth[u] - depth[v]
k := 0
for diff > 0 {
if diff&1 != 0 {
u = up[k][u]
}
diff >>= 1
k++
}
if u == v {
return u
}
for k = LOG - 1; k >= 0; k-- {
if up[k][u] != up[k][v] {
u = up[k][u]
v = up[k][v]
}
}
return parent[u]
}
out := make([]byte, 0, q*24)
for i := 0; i < q; i++ {
u := readInt()
v := readInt()
l := lca(u, v)
ans := pref[u] + pref[v] - 2*pref[l] + C[l]
out = strconv.AppendInt(out, ans, 10)
out = append(out, '\n')
}
_, _ = os.Stdout.Write(out)
}