rt
#include <bits/stdc++.h>
using namespace std;
int n,q;
struct edge{
int to,nxt,val;
}e[400050];
int c[200050];
int h[200050];
int dis[200050][21];
int tot;
void add(int u,int v,int w){
e[++tot].to=v;
e[tot].val=w;
e[tot].nxt=h[u];
h[u]=tot;
}
int d[200050],anc[200050][21];
void dfs(int u,int fa){
for (int i=h[u];i;i=e[i].nxt){
int v=e[i].to;
if (v==fa) continue;
d[v]=d[u]+1;
anc[v][0]=u;
dis[v][0]=e[i].val;
// cout<<"v:"<<v<<"dis[v][0]:"<<dis[v][0]<<endl;
dfs(v,u);
}
}
void init(){
for (int i=1;i<=20;i++){
for (int j=1;j<=n;j++){
anc[j][i]=anc[anc[j][i-1]][i-1];
if (anc[j][i]!=0)
dis[j][i]=dis[j][i-1]+dis[anc[j][i-1]][i-1];
}
}
}
int LCA(int x, int y){
if (x==y) return 0;
// cout<<"x:"<<d[x]<<" y:"<<d[y]<<" t ";
if (d[x]<d[y]){
swap(x,y);
}
int len=0;
for (int i=20;i>=0;i--){
if (d[anc[x][i]]>=d[y]){
len+=dis[x][i];
x=anc[x][i];
}
}
if (x==y) return len;
for (int i=20;i>=0;i--){
if (anc[x][i]!=anc[y][i]){
len+=dis[x][i],len+=dis[y][i];
x=anc[x][i],y=anc[y][i];
}
}
len+=dis[x][0],len+=dis[y][0];
return len;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>q;
for (int i=1;i<=n;i++){
cin>>c[i];
}
for (int i=1;i<=n-1;i++){
int tu,tv,tw;
cin>>tu>>tv>>tw;
add(tu,tv,tw);
add(tv,tu,tw);
}
d[1]=1;
dfs(1,0);
init();
for (int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
int ans=INT32_MIN;
for (int j=1;j<=n;j++){
ans=max(ans,c[j]+c[x]+c[y]-LCA(x,j)-LCA(j,y));
}
cout<<ans<<"\n";
}
}