#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, inf = 0x3f3f3f3f;
typedef long long ll;
int N, Ai, Bi, Li, ans, all;
int c[maxn], dp[maxn], siz[maxn], dep[maxn];
struct edge {
int to, cost;
} h;
vector <edge> e[maxn];
void dfs1(int now, int f) {
siz[now] = c[now];
for (int i = 0; i < e[now].size(); ++i) {
int v = e[now][i].to, w = e[now][i].cost;
if (v == f) {
continue;
}
dep[v] = dep[now] + w;
dfs1(v, now);
siz[now] += siz[v];
}
return ;
}
void dfs2(int now, int f) {
for (int i = 0; i < e[now].size(); ++i) {
int v = e[now][i].to, w = e[now][i].cost;
if (v == f) {
continue;
}
dp[v] = dp[now] - siz[now] * w + (all - siz[now]) * w;
dfs2(v, now);
}
return ;
}
int main(void) {
scanf("%d", &N);
for (int i = 1; i <= N; ++i) {
scanf("%d", &c[i]);
all += c[i];
}
for (int i = 1; i < N; ++i) {
scanf("%d %d %d", &Ai, &Bi, &Li);
h.to = Bi, h.cost = Li;
e[Ai].push_back(h);
h.to = Ai;
e[Bi].push_back(h);
}
dfs1(1, 0);
for (int i = 1; i <= N; ++i) {
dp[1] += c[i] * dep[i];
}
dfs2(1, 0);
ans = inf;
for (int i = 1; i <= N; ++i) {
ans = min(ans, dp[i]);
}
printf("%d", ans);
return 0;
}