#include<bits/stdc++.h> #define MAXN 200005 #define int long long usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int C[MAXN]; structEdge{ int to,len; }; vector<Edge>G[MAXN]; inlinevoidAddEdge(int u,int v,int w){ G[u].push_back(Edge{v,w}); } int sz[MAXN],sum; int val[MAXN],dp[MAXN]; voidinit(int u,int father){ sz[u]=C[u]; for (registerint i=0;i<G[u].size();++i){ int v=G[u][i].to,w=G[u][i].len; if (v!=father){ init(v,u); sz[u]+=sz[v]; val[u]+=val[v]; val[u]+=sz[v]*w; } } } int ans; voiddfs(int u,int father){ ans=min(ans,dp[u]); for (registerint i=0;i<G[u].size();++i){ int v=G[u][i].to,w=G[u][i].len; if (v!=father){ dp[v]=dp[u]-sz[v]*w+(sz[1]-sz[v])*w; dfs(v,u); } } } #undef int intmain(){ #define int long long int n=read(); for (registerint i=1;i<=n;++i){ C[i]=read(); } for (registerint i=1;i<n;++i){ int u=read(),v=read(),w=read(); AddEdge(u,v,w); AddEdge(v,u,w); } init(1,1); ans=1e15; dp[1]=val[1]; dfs(1,1); printf("%lld\n",ans); }