#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
const int mx=2e5+50;
int n,q,c[mx],u,vv,w;
int fa[mx][50],cost[mx][50],dep[mx],dp[mx],fdp[mx],st[mx][50];
vector<pii> v[mx];
void print(int i)
{
cout<<i;
}
void dfsdp(int r,int f)
{
dp[r]=c[r-1];
for(int i=0;i<v[r].size();i++)
{
if(v[r][i].fi==f)
{
continue;
}
dfsdp(v[r][i].fi,r);
dp[r]=max(dp[r],dp[v[r][i].fi]-2*v[r][i].se);
}
fdp[r]=dp[r];
return;
}
void dfsfdp(int r,int f)
{
for(int i=0;i<v[r].size();i++)
{
if(v[r][i].fi==f)
{
fdp[r]=max(fdp[r],fdp[f]-2*v[r][i].se);
break;
}
}
for(int i=0;i<v[r].size();i++)
{
if(v[r][i].fi==f)
{
continue;
}
dfsdp(v[r][i].fi,r);
}
return;
}
void mst()
{
for(int i=1;i<=n;i++)
{
st[i][0]=dp[i];
}
for(int i=1;i<45;i++)
{
for(int j=1;j<=n;j++)
{
st[j][i]=max(st[j][i-1],st[fa[j][i-1]][i-1]);
}
}
}
void dfs(int r,int f)
{
fa[r][0]=f;
dep[r]=dep[fa[r][0]]+1;
for (int i=1;i<45;++i)
{
fa[r][i]=fa[fa[r][i-1]][i-1];
cost[r][i]=cost[fa[r][i-1]][i-1]+cost[r][i-1];
}
for(int i=0;i<v[r].size();i++)
{
if(v[r][i].fi==f)
{
continue;
}
cost[v[r][i].fi][0]=v[r][i].se;
dfs(v[r][i].fi,r);
}
}
pii lca(int x,int y)
{
if(dep[x]>dep[y])
{
swap(dep[x],dep[y]);
}
int tmp=dep[y]-dep[x],ans=0;
for(int i=0;tmp;i++,tmp>>=1)
{
if(tmp&1)
{
ans+=cost[y][i];
y=fa[y][i];
}
}
if(x==y)
{
return mp(ans,x);
}
for(int i=44;i>=0 and y!=x;i--)
{
if(fa[x][i]!=fa[y][i])
{
ans+=cost[x][i]+cost[y][i];
x=fa[x][i];
y=fa[y][i];
}
}
ans+=cost[x][0]+cost[y][0];
return mp(ans,fa[x][0]);
}
int query(int x,int y)
{
pii getp=lca(x,y);
int ans=-getp.fi+c[x-1]+c[y-1],td=getp.se;
cout<<getp.fi<<' '<<getp.se<<' '<<c[x-1]<<' '<<c[y-1]<<' ';
int val=fdp[td];
int mh=dep[td]-dep[x];
cout<<dep[td]<<' '<<dep[x]<<endl;
for(int i=44;i>=0;i--)
{
cout<<i<<' '<<val<<' '<<mh<<' '<<((int)1<<i)<<endl;;
if(mh>=(1<<i))
{
mh-=(1<<i);
val=max(val,st[x][i]);
x=fa[x][i];
}
}
mh=dep[td]-dep[y];
for(int i=44;i>=0;i--)
{
if(mh>=(1<<i))
{
mh-=(1<<i);
val=max(val,st[y][i]);
x=fa[y][i];
}
}
cout<<val<<endl;
return val+ans;
}
signed main()
{
cin>>n>>q;
for(int i=0;i<n;i++)
{
cin>>c[i];
}
for(int i=1;i<n;i++)
{
cin>>u>>vv>>w;
v[u].push_back(mp(vv,w));
v[vv].push_back(mp(u,w));
}
dfs(1,0);
dfsdp(1,0);
dfsfdp(1,0);
mst();
int x,y;
for(int i=0;i<q;i++)
{
cin>>x>>y;
cout<<query(x,y)<<endl;
}
for(int j=1;j<=n;j++)
{
cout<<dp[j]<<' ';
}
cout<<endl;
for(int j=1;j<=n;j++)
{
cout<<fdp[j]<<' ';
}
cout<<endl;
for(int i=0;i<45;i++)
{
for(int j=1;j<=n;j++)
{
cout<<st[j][i]<<' ';
}
cout<<endl;
}
return 0;
}