
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define N 2000005
using namespace std;
long long n, m, k, v[N];
long long par[N];
struct Edge {
long long u, v, w;
bool friend operator < (const Edge &x, const Edge &y) {
return x.w < y.w;
}
} e[N];
void init() {
for (long long i = 0; i <= n; i++) {
par[i] = i;
}
}
long long find(long long x) {
return (par[x] == x ? x : par[x] = find(par[x]));
}
void unite(long long x, long long y) {
x = find(x), y = find(y);
if (x == y) return;
par[x] = y;
}
bool same(long long x, long long y) {
return find(x) == find(y);
}
long long kruscal() {
long long res = 0, cnt = 0;
sort(e + 1, e + k + 1);
for (long long i = 1; i <= k; i++) {
long long u = e[i].u, v = e[i].v, w = e[i].w;
if (same(u, v)) continue;
unite(u, v);
res += w;
cnt++;
if (cnt == n) break;
}
return res;
}
signed main() {
scanf("%lld%lld", &n, &m);
init();
for (long long i = 1; i <= n; i++) {
scanf("%lld", &v[i]);
}
for (long long i = 1; i <= n; i++) {
for (long long j = i + 1; j <= n; j++) {
e[++k] = Edge{i, j, v[i] + v[j]};
}
}
while (m--) {
long long a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
e[++k] = Edge{a, b, c};
}
printf("%lld", kruscal());
return 0;
}