Rt,才20pts
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+10;
int c[N],head[N],tot,d[3][N];
bool vis[N];
struct Edge{
int nxt,to,val;
}e[N];
void adde(int u,int v,int w){
e[++tot].nxt=head[u];
e[tot].to=v;
e[tot].val=w;
head[u]=tot;
return;
}
void dfs(int s,int id){
for(int i=head[s];i;i=e[i].nxt){
int v=e[i].to,w=e[i].val;
if(vis[v]) continue;
vis[v]=1;
d[id][v]=d[id][s]+w;
dfs(v,id);
}
return;
}
signed main(){
//freopen("speaker2.in","r",stdin);
//freopen("speaker2.out","w",stdout);
int n,q;cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>c[i];
}
for(int i=1;i<n;i++){
int u,v,w;cin>>u>>v>>w;
adde(u,v,w);
adde(v,u,w);
}
while(q--){
for(int i=1;i<=n;i++){
d[1][i]=d[2][i]=0;
}
int x,y;cin>>x>>y;
memset(vis,0,sizeof(vis));
vis[x]=1;
dfs(x,1);
memset(vis,0,sizeof(vis));
vis[y]=1;
dfs(y,2);
int maxn=-2e9-10;
for(int i=1;i<=n;i++){
//cout<<d[1][i]<<" ";
maxn=max(maxn,c[i]-d[1][i]-d[2][i]);
}
//cout<<endl;
cout<<maxn+c[x]+c[y]<<endl;
}
return 0;
}