#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e5+10;
int n,head[N],cnt,fa[N];
int siz[N],mx[N],rt,sum,vis[N],cc,top;
ll Ans,w[N];
struct Ed{int fr,to;ll w;}E[N*30];
struct edge{int next,to,w;}a[N<<1];
void link(int x,int y,int w) {a[++cnt]=(edge){head[x],y,w};head[x]=cnt;}
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
int cmp1(const Ed&A,const Ed&B) {return A.w<B.w;}
void Getsum(int x,int fr)
{
	for(int i=head[x];i;i=a[i].next)
		if(a[i].to!=fr&&!vis[a[i].to])
			Getsum(a[i].to,x);sum++;
}
void Getrt(int x,int fr)
{
	siz[x]=1;mx[x]=0;
	for(int i=head[x];i;i=a[i].next)
	{
		int R=a[i].to;
		if(R==fr||vis[R]) continue;
		Getrt(R,x);
		siz[x]+=siz[R];
		mx[x]=max(mx[x],siz[R]);
	}
	mx[x]=max(mx[x],sum-siz[x]);
	if(mx[rt]>mx[x]) rt=x;
}
int P;ll VAL;
void DFS(int x,int fr,ll dep)
{
	if(dep+w[x]<VAL) VAL=dep+w[x],P=x;
	for(int i=head[x];i;i=a[i].next)
		if(!vis[a[i].to]&&a[i].to!=fr)
			DFS(a[i].to,x,dep+a[i].w);
}
void Link(int x,int fr,ll dep)
{
	E[++cc]=(Ed){x,P,VAL+dep+w[x]};
	for(int i=head[x];i;i=a[i].next)
		if(!vis[a[i].to]&&a[i].to!=fr)
			Link(a[i].to,x,dep+a[i].w);
}
void Solve(int x)
{
	rt=sum=0;Getsum(x,0);Getrt(x,0);
//	printf("solve %d\n",rt);
	vis[x=rt]=1;VAL=1e18;DFS(x,0,0);Link(x,0,0);
	for(int i=head[x];i;i=a[i].next)
		if(!vis[a[i].to]) Solve(a[i].to);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
	for(int i=1,x,y,w;i<n;i++)
		scanf("%d%d%d",&x,&y,&w),link(x,y,w),link(y,x,w);
	mx[0]=1e9;Solve(1);
	sort(E+1,E+cc+1,cmp1);
	for(int i=1;i<=cc;i++)
	{
		if(E[i].fr>E[i].to) swap(E[i].fr,E[i].to);
//		printf("%d %d w=%lld\n",E[i].fr,E[i].to,E[i].w);
	}
	for(int i=1;i<=n;i++) fa[i]=i;
//	cout<<"cc="<<cc<<endl;
	for(int i=1;i<=cc;i++)
	{
		int x=find(E[i].fr),y=find(E[i].to);
		if(x!=y) fa[x]=y,Ans+=E[i].w;
	}
	cout<<Ans<<endl;
}
