#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
struct cw{
int s,e,dis;
}cow[114514];
int n,p,c[114514],f[114514];
int find(int x){
if(f[x] == x) return x;
else return f[x] = find(f[x]);
}
bool cmp(cw x,cw y){
return x.dis < y.dis;
}
signed main(){
IOS
cin >> n >> p;
for(int i = 1;i <= n;i++) cin >> c[i];
for(int i = 1;i <= p;i++){
cin >> cow[i].s >> cow[i].e >> cow[i].dis;
cow[i].dis = c[cow[i].s] + c[cow[i].e] + 2 * cow[i].dis;
}
sort(cow + 1,cow + p + 1,cmp);
int sum = 0;
for(int i = 1;i <= n;i++) f[i] = i;
for(int i = 1;i <= p;i++){
int x = find(cow[i].s),y = find(cow[i].e);
if(x != y) sum += cow[i].dis,f[x] = y;
}
sort(c + 1,c + n + 1);
cout << c[1] + sum;
return 0;
}
//数据不清空,爆零两行泪。
//多测不读完,爆零两行泪。
//边界不特判,爆零两行泪。
//贪心不证明,爆零两行泪。
//DP顺序错,爆零两行泪。
//大小少等号,爆零两行泪。
//变量不统一,爆零两行泪。
//越界不判断,爆零两行泪。
//调试不注释,爆零两行泪。
//溢出不long long,爆零两行泪。