https://www.luogu.org/problem/P2986
**
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const long long MAXN=200005;
long long n,m,a[200005],sum,ec,x,y,z,w[MAXN],v[MAXN],fir[MAXN],nex[MAXN],ans,f[MAXN],dis[MAXN];
long long read(){
char ch;long long w,f;w=0;f=1;
ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return w*f;
}
void add(long long mu,long long mv,long long mw){
++ec;v[ec]=mv;w[ec]=mw;
nex[ec]=fir[mu];fir[mu]=ec;
}
void tree(long long fa,long long now){
dis[now]=a[now];
for (long long i=fir[now];i;i=nex[i])
if (v[i]!=fa){
tree(now,v[i]);dis[now]+=dis[v[i]];
f[now]=max(f[now],dis[v[i]]);
}
f[now]=max(f[now],sum-dis[now]);
}
void find(long long fa,long long now){
for (long long i=fir[now];i;i=nex[i])
if (fa!=v[i]){
dis[v[i]]=dis[now]+w[i];
find(now,v[i]);
}
}
int main(){
n=read();//m=read();
for(long long i=1;i<=n;i++) a[i]=read(),sum+=a[i];
for(long long i=1;i<n;i++){
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
}tree(1,1);long long mark=1;
for(long long i=2;i<=n;i++)
if (f[i]<f[mark]) mark=i;
dis[mark]=0;
find(mark,mark);
for(long long i=1;i<=n;i++) ans+=(dis[i]*a[i]);
printf("%lld\n",ans);
return 0;
}**