#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,q,c[N],dep[N],st[N][25],dis[N];//dis[i]表示1-i的边权之和,dep[i]表示节点i的深度,st[u][i]表示节点u向上跳2^i次方的节点是什么
struct uuu{
int v,w;
};
vector <uuu> v[N];
void dfs(int u,int fa,int w)
{
dep[u]=dep[fa]+1;
st[u][0]=fa;
dis[u]=dis[fa]+w;
for(int i=1;i<=20;i++)
{
st[u][i]=st[st[u][i-1]][i-1];
}
for(int i=0;i<v[u].size();i++)
{
int v2=v[u][i].v,w=v[u][i].w;
if(v2==fa) continue;
dfs(v2,u,w);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--)
{
if(dep[st[x][i]]>=dep[y]) x=st[x][i];
}
if(x==y) return x;
for(int i=20;i>=0;i--)
{
if(st[x][i]!=st[y][i]) x=st[x][i],y=st[x][i];
}
return st[x][0];
}
int dist(int x,int y)
{
int lca=LCA(x,y);
return abs(dis[x]-dis[lca])+abs(dis[y]-dis[lca]);
}
int query(int x,int y)
{
int ans=-1e18;
for(int i=1;i<=n;i++)
{
ans=max(ans,c[x]+c[y]+c[i]-dist(x,i)-dist(i,y));
}
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
for(int i=1;i<=n-1;i++)
{
int u,v2,w;
// cin>>u>>v2>>w;
scanf("%lld%lld%lld",&u,&v2,&w);
v[u].push_back((uuu){v2,w});
v[v2].push_back((uuu){u,w});
}
dfs(1,0,0);
while(q--)
{
int x,y;
// cin>>x>>y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y));
// cout<<query(x,y)<<"\n";
}
}