#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 100000 + 10;
const long long inf = 1e18;
struct edge
{
int node, weight;
edge(int node_, int weight_):
node(node_), weight(weight_) {}
};
vector<edge> p[maxn];
int c[maxn], dis[maxn], numc[maxn];
int n;
long long dp[maxn];
void dfs1 (int u, int fa)
{
numc[u] = c[u];
for (int i = 0; i < p[u].size(); i++)
{
int v = p[u][i].node;
if (v == fa) continue;
dis[v] = dis[u] + p[u][i].weight;
dfs1(v, u);
numc[u] += numc[v];
}
}
void dfs2 (int u, int fa)
{
for (int i = 0; i < p[u].size(); i++)
{
int v = p[u][i].node;
if (v == fa) continue;
dp[v] = dp[u] + (numc[1] - 2 * numc[v]) * p[u][i].weight;
dfs2 (v, u);
}
}
int main ()
{
// freopen("P2986_8.in", "r", stdin);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> c[i];
int x, y, z;
for (int i = 1; i < n; i++)
{
cin >> x >> y >> z;
p[x].push_back(edge(y, z));
p[y].push_back(edge(x, z));
}
dfs1(1, 0);
for (int i = 2; i <= n; i++)
dp[1] += dis[i] * c[i];
dfs2(1, 0);
long long ans = dp[1];
for (int i = 1; i <= n; i++)
if (dp[i] < ans)
ans = dp[i];
cout << ans << endl;
return 0;
}