#include <bits/stdc++.h>   using namespace std;   const long long INF = (long long)1e18;   const int mod = (int)1e9 + 7;   const int MAXN = (int)4e5 + 5;   long long n, ans[MAXN], ext[MAXN];   vector<pair<int, pair<int, int>>> sorg[MAXN];   vector<pair<int, int>> adj[MAXN];   int a[MAXN];   const int L = 20;   int geri[MAXN];   int par[MAXN][L], dep[MAXN];   int tin[MAXN], tout[MAXN];   int Gt = 1;   void dfs0(int v, int pr) {     tin[v] = Gt++;     if (pr == -1) {       dep[v] = 0;       par[v][0] = v;     } else {       dep[v] = dep[pr] + 1;       par[v][0] = pr;     }     for (int j = 1; j < L; j++) par[v][j] = par[par[v][j - 1]][j - 1];     ext[v] = a[v];     for (pair<int, int> j : adj[v]) {       if (j.first == pr) continue;       geri[j.first] = j.second;       dfs0(j.first, v);       ext[v] += max(0LL, -2LL * j.second + ext[j.first]);     }     tout[v] = Gt - 1;   }   int gtp(int v, int dd) {     for (int i = L - 1; i >= 0; i--) {       if ((1 << i) <= dd) {         v = par[v][i];         dd -= (1 << i);       }     }     return v;   }   int find_lca(int a, int b) {     if (dep[a] > dep[b]) swap(a, b);     for (int i = L - 1; i >= 0; i--) {       if (dep[a] + (1 << i) <= dep[b]) b = par[b][i];     }     if (a == b) return a;     for (int i = L - 1; i >= 0; i--) {       if (par[a][i] != par[b][i]) {         a = par[a][i];         b = par[b][i];       }     }     return par[a][0];   }   long long t[MAXN];   void upd(int l, int r, long long val) {     r++;     for (; l < MAXN; l += (l & -l)) t[l] += val;     for (; r < MAXN; r += (r & -r)) t[r] -= val;   }   long long gt(int v) {     long long res = 0;     for (; v; v -= (v & -v)) res += t[v];     return res;   }   void dfs1(int v, int pr, long long sum) {     upd(tin[v], tin[v], ext[v]);     long long nS = sum + a[v];     for (pair<int, int> u : adj[v]) {       if (u.first == pr) continue;       nS += max(0LL, -2 * u.second + ext[u.first]);     }     for (pair<int, int> u : adj[v]) {       if (u.first == pr) continue;       nS -= max(0LL, -2 * u.second + ext[u.first]);       dfs1(u.first, v, max(0LL, nS - 2 * u.second));       nS += max(0LL, -2 * u.second + ext[u.first]);     }     unordered_map<int, long long> mp;     for (pair<int, int> u : adj[v]) {       if (u.first == pr) continue;       long long dg = max(0LL, -2 * u.second + ext[u.first]);       mp[u.first] = dg;     }     for (auto u : sorg[v]) {       int a = u.second.first, b = u.second.second;       if (b == v) swap(a, b);       if (a == v && b == v) {         ans[u.first] = sum + ext[v];       } else if (a == v) {         int r1 = gtp(b, dep[b] - dep[v] - 1);         ans[u.first] = sum + ext[v] + gt(tin[b]) - mp[r1] - geri[r1];       } else {         int r1 = gtp(b, dep[b] - dep[v] - 1), r2 = gtp(a, dep[a] - dep[v] - 1);         ans[u.first] = sum + ext[v] + gt(tin[b]) + gt(tin[a]) - mp[r1] - mp[r2] -                        geri[r1] - geri[r2];       }     }     for (pair<int, int> u : adj[v]) {       if (u.first == pr) continue;       upd(tin[u.first], tout[u.first], ext[v] - mp[u.first] - u.second);     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     cout.tie(nullptr);     int q;     cin >> n >> q;     for (int i = 1; i <= n; i++) cin >> a[i];     for (int i = 0; i < n - 1; i++) {       int u, v, w;       cin >> u >> v >> w;       adj[u].push_back({v, w});       adj[v].push_back({u, w});     }     dfs0(1, -1);     for (int i = 0; i < q; i++) {       int u, v;       cin >> u >> v;       sorg[find_lca(u, v)].push_back({i, {u, v}});     }     dfs1(1, -1, 0);     for (int i = 0; i < q; i++) cout << ans[i] <<   n ;   }