#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
vector<pair<ll,ll> > G[200005];
ll n,a[200005],u,v,w,fa[200005],h[200005],cnt,c[200005],flg=1,ans;
struct node{
ll v1,col1,v2,col2;
}f[200005][2],pre[200005],suf[200005];
pair<ll,ll> mn[200005];
node _PrePare(){
node z;
z.col1=z.col2=0;
z.v1=z.v2=1e17;
return z;
}
node adds(node x,ll y){
x.v1+=y;
x.v2+=y;
return x;
}
node mknd(ll x,ll y){
node z;
z.v2=1e17;
z.col2=0;
z.v1=x,z.col1=y;
return z;
}
node merges(node x,ll y,ll z){
node ret=x;
if(y<ret.v1){
if(z==ret.col1){
ret.v1=y;
}
else{
ret.v2=ret.v1;
ret.col2=ret.col1;
ret.v1=y;
ret.col1=z;
}
}
else if(y<ret.v2){
ret.v2=y;
ret.col2=z;
}
return ret;
}
node merge(node x,node y){
node z=x;
z=merges(z,y.v1,y.col1);
z=merges(z,y.v2,y.col2);
return z;
}
ll find(ll x){
if(x==fa[x]){
return x;
}
return fa[x]=find(fa[x]);
}
void dfs(ll x,ll fat){
for(ll i=0;i<G[x].size();i++){
if(G[x][i].first==fat){
continue;
}
dfs(G[x][i].first,x);
f[x][0]=merge(f[x][0],adds(f[G[x][i].first][0],G[x][i].second));
f[x][0]=merge(f[x][0],mknd(G[x][i].second+a[G[x][i].first],c[G[x][i].first]));
}
}
void dfs2(ll x,ll fat){
if(G[x][0].first==fat){
pre[0]=_PrePare();
}
else{
pre[0]=adds(f[G[x][0].first][0],G[x][0].second);
pre[0]=merge(pre[0],mknd(G[x][0].second+a[G[x][0].first],c[G[x][0].first]));
}
ll m=(ll)G[x].size();
for(ll i=1;i<m;i++){
pre[i]=pre[i-1];
if(G[x][i].first==fat){
continue;
}
pre[i]=merge(pre[i],adds(f[G[x][i].first][0],G[x][i].second));
pre[i]=merge(pre[i],mknd(G[x][i].second+a[G[x][i].first],c[G[x][i].first]));
}//-----------------------------------------
if(G[x][m-1].first==fat){
suf[m-1]=_PrePare();
}
else{
suf[m-1]=adds(f[G[x][m-1].first][0],G[x][m-1].second);
suf[m-1]=merge(pre[m-1],mknd(G[x][m-1].second+a[G[x][m-1].first],c[G[x][m-1].first]));
}
for(ll i=m-2;i>=0;i--){
suf[i]=suf[i+1];
if(G[x][i].first==fat){
continue;
}
suf[i]=merge(suf[i],adds(f[G[x][i].first][0],G[x][i].second));
suf[i]=merge(suf[i],mknd(G[x][i].second+a[G[x][i].first],c[G[x][i].first]));
}
for(ll i=0;i<G[x].size();i++){
if(G[x][i].first==fat){
continue;
}
f[G[x][i].first][1]=adds(f[x][1],G[x][i].second);
f[G[x][i].first][1]=merge(f[G[x][i].first][1],mknd(a[x]+G[x][i].second,c[x]));
if(i>=1){
f[G[x][i].first][1]=merge(f[G[x][i].first][1],adds(pre[i-1],G[x][i].second));
}
if(i+1<m){
f[G[x][i].first][1]=merge(f[G[x][i].first][1],adds(suf[i+1],G[x][i].second));
}
dfs2(G[x][i].first,x);
}
}
int main(){
cin>>n;
for(ll i=1;i<=n;i++){
cin>>a[i];
c[i]=i;
fa[i]=i;
}
for(ll i=1;i<=n-1;i++){
cin>>u>>v>>w;
G[u].push_back({v,w});
G[v].push_back({u,w});
}
while(1){
cnt++;
flg=1;
for(ll i=1;i<=n;i++){
mn[i]={1e17,0};
c[i]=find(i);
h[i]=0;
if(c[i]!=c[1]){
flg=0;
}
}
if(flg){
break;
}
for(ll i=1;i<=n;i++){
h[c[i]]++;
f[i][0]=f[i][1]=_PrePare();
}
dfs(1,0);
dfs2(1,0);
for(ll i=1;i<=n;i++){
node F=merge(f[i][0],f[i][1]);
F=adds(F,a[i]);
if(F.col1!=c[i]&&F.col1){
mn[c[i]]=min(mn[c[i]],{F.v1,F.col1});
}
if(F.col2!=c[i]&&F.col2){
mn[c[i]]=min(mn[c[i]],{F.v2,F.col2});
}
}
for(ll i=1;i<=n;i++){
if(h[i]){
if(mn[i].first<=1e16){
if(find(i)!=find(mn[i].second)){
ans+=mn[i].first;
//cout<<i<<" "<<mn[i].second<<" Round "<<cnt<<" "<<mn[i].first<<" "<<f[3][1].v1<<" "<<f[3][1].col1<<endl;
fa[find(i)]=find(mn[i].second);
}
}
}
}
//cout<<ans;
}
cout<<ans;
return 0;
}
能帮着调调或者给组hack都行。