#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAX_N 10010
#define MAX_M 100010
struct node{
int u,v,val;
}edge[MAX_M];
int fa[MAX_N]; //保存根节点
int c[MAX_N];
//sort排序
bool cmp(node a,node b)
{
return a.val<b.val;
}
//并查集思想,寻找根节点
int find(int a){
if (fa[a]==a) {return a; }
return fa[a]=find(fa[a]);
}
void kruscal(int n,int p){
for (int i=1;i<=n;i++){
fa[i]=i;
}
int count=1;
int k=0;
int sum=0;
while(count<n){
int u=edge[k].u,v=edge[k].v,val=edge[k].val;
k++;
int fu=find(u),fv=find(v);
if (fu==fv)continue;
sum+=val;
fa[fv]=fu;
count++;
}
int min=c[1];
for ( int i=2;i<=n;i++ )
{
if (min>c[i]){
min=c[i];
}
}
cout<<sum+min<<endl;
}
int main()
{
int n,p;
int u,v,val;
cin>>n>>p;
for (int i=1;i<=n;i++){
cin>>c[i];
}
for (int i=0;i<p;i++){
cin>>u>>v>>val;
edge[i].u=u;
edge[i].v=v;
edge[i].val=c[u]+c[v]+2*val;
}
sort(edge,edge+p,cmp);
kruscal(n,p);
return 0;
}