#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
long long c[1000005];
long long dp[1000005];
long long sz[1000005];
long long ans[1000005];
bool vis[1000005];
struct road{
int r;
int l;
};
vector<road> t[1000005];
void dfs(int x)
{
vis[x] = 1;
sz[x] = c[x];
for(int i = 0;i < t[x].size();i++)
{
int v = t[x][i].r;
if(!vis[v])
{
dfs(v);
sz[x] += sz[v];
dp[x] = dp[x] + dp[v] + sz[v] * t[x][i].l;
}
}
}
void down(int x)
{
vis[x] = 1;
for(int i = 0;i < t[x].size();i++)
{
int v = t[x][i].r;
if(!vis[v])
{
ans[v] = dp[v] + ans[x] - dp[v] - sz[v] * t[x][i].l + t[x][i].l * (n - sz[v]);
dfs(v);
}
}
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
cin >> c[i];
for(int i = 1;i <= n-1;i++)
{
int a,b,m;
cin >> a >> b >> m;
road q;
q.r = b;
q.l = m;
t[a].push_back(q);
q.r = a;
t[b].push_back(q);
}
vis[1] = 1;
dfs(1);
ans[1] = dp[1];
memset(vis,0,sizeof(vis));
vis[1] = 1;
down(1);
long long minn = 0;
for(int i = 1;i <= n;i++)
{
minn = min(minn,ans[i]);
}
cout << minn;
return 0;
}