#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int MAXN=220000;
const ll INF=1E18;
int n, m, a[MAXN];
struct Edge
{
	int to, val;
	Edge(int v, int w): to(v), val(w) {}
};
vector<Edge> g[MAXN];
struct DSU
{
	int f[MAXN];
	void init()
	{
		for (int i=1; i<=n; i++) f[i]=i;
	}
	int getf(int x)
	{
		if (x==f[x]) return x;
		return f[x]=getf(f[x]);
	}
	bool merge(int u, int v)
	{
		int x=getf(u), y=getf(v);
		if (x==y) return 0;
		f[x]=y; return 1;
	}
} dsu;
typedef pair<ll, int> pli;
pli dp1[MAXN], dp2[MAXN], p[MAXN];
void dfs1(int u, int f)
{
	for (Edge e:g[u])
	{
		int v=e.to;
		if (v!=f)
		{
			dfs1(v, u);
			dp1[u]=min(dp1[u],
			make_pair(dp1[v].first+e.val, dp1[v].second));
		}
	}
}
void dfs2(int u, int f)
{
	for (Edge e:g[u])
	{
		int v=e.to;
		if (v!=f)
		{
			dp1[v]=min(dp1[v],
			make_pair(dp1[u].first+e.val, dp1[u].second));
			dfs2(v, u);
		}
	}
	for (Edge e:g[u])
	{
		int v=e.to;
		if (v!=f)
		{
			dp2[u]=min(dp2[u], dsu.f[dp1[v].second]!=dsu.f[dp1[u].second]?
			make_pair(dp1[v].first+e.val, dp1[v].second):
			make_pair(dp2[v].first+e.val, dp2[v].second));
		}
	}
}
void dfs3(int u, int f)
{
	for (Edge e:g[u])
	{
		int v=e.to;
		if (v!=f)
		{
			dp2[v]=min(dp2[v], dsu.f[dp1[u].second]!=dsu.f[dp1[v].second]?
			make_pair(dp1[u].first+e.val, dp1[u].second):
			make_pair(dp2[u].first+e.val, dp2[u].second));
			dfs3(v, u);
		}
	}
}
int main()
{
//	freopen("AT3611.in", "r", stdin);
//	freopen("AT3611.out", "w", stdout);
	scanf("%d", &n);
	for (int i=1; i<=n; i++) scanf("%d", &a[i]);
	for (int i=1; i<n; i++)
	{
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		g[u].push_back(Edge(v, w));
		g[v].push_back(Edge(u, w));
	}
	dsu.init();
	int cnt=0; ll ans=0;
	while (cnt<n-1)
	{
		for (int i=1; i<=n; i++)
		{
			dp1[i]=make_pair(a[i], i);
			dp2[i]=make_pair(INF, 0);
		}
		dfs1(1, 0); dfs2(1, 0); dfs3(1, 0);
		for (int i=1; i<=n; i++)
		{
			p[i]=dsu.f[dp1[i].second]!=dsu.f[i]?dp1[i]:dp2[i];
			p[i].first+=a[i];
		}
		for (int i=1; i<=n; i++) p[dsu.f[i]]=min(p[dsu.f[i]], p[i]);
		for (int i=1; i<=n; i++)
		{
			pli t=p[dsu.getf(i)];
			if (t.first<INF&&dsu.merge(i, t.second)) cnt++, ans+=t.first;
		}
		for (int i=1; i<=n; i++) dsu.getf(i);
	}
	printf("%lld\n", ans);
	return 0;
}