#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void in(T &x){
int f=1;char c;
do{
c=getchar();
f=c=='-'?-1:f;
}while(c<'0'||c>'9');
for(x=0;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
x*=f;
}
const int N=200005;
int n,q;
int a[200005],dep[N],fa[18][N];
long long cost[18][N];
int tot,head[N],ver[N<<1],nxt[N<<1],edge[N<<1];
inline void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z;
nxt[tot]=head[x],head[x]=tot;
}
inline void dfs(int x,int f){
dep[x]=dep[f]+1;
fa[0][x]=f;
for(int i=1;i<18;++i){
fa[i][x]=fa[i-1][fa[i-1][x]];
cost[i][x]=cost[i-1][fa[i-1][x]]+cost[i-1][x];
}
for(int i=head[x];i;i=nxt[i]){
if(ver[i]==f) continue;
cost[0][ver[i]]=edge[i];
dfs(ver[i],x);
}
}
inline long long lca(int x,int y){
long long ans=a[x]+a[y];
if(x==y) return ans;
if(dep[x]>dep[y]) swap(x,y);
int tmp=dep[y]-dep[x];
for(int i=0;i<18;++i){
if(tmp&(1<<i)){
ans-=cost[i][y];
y=fa[i][y];
}
}
if(x==y) return ans;
for(int i=17;i>=0;--i){
if(fa[i][x]!=fa[i][y]){
ans-=cost[i][x];
ans-=cost[i][y];
x=fa[i][x];
y=fa[i][y];
}
}
ans-=cost[0][x];
ans-=cost[0][y];
return ans;
}
int main(){
in(n),in(q);
for(int i=1;i<=n;++i) in(a[i]);
for(int i=1,x,y,z;i<n;++i){
in(x),in(y),in(z);
add(x,y,z);add(y,x,z);
}
dfs(1,0);
while(q--){
int x,y;
long long sum=-0x3f3f3f3f;
in(x),in(y);
for(int i=1;i<=n;++i){
sum=max(sum,lca(x,i)+lca(i,y)-a[i]);
}
printf("%lld\n",sum);
}
return 0;
}