#include <fstream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <complex>
#include <map>
#include <set>
#include <queue>

using namespace std;

typedef pair<int,int> pii;

struct edge{
  int to;
  int cost;
  edge(){}
  edge(int t,int c){
    to=t;
    cost=c;
  }
};

int N,M;
pii hs[201];
vector<edge> G[201];
bool noNode[201];

int makeMST(int st){
  int sumCost=0;
  priority_queue<pii,vector<pii>,greater<pii> > pq;
  bool used[201]={};
  pq.push(pii(0,st));
  while(pq.size()){
    pii p=pq.top();pq.pop();
    if(used[p.second])continue;
    if(noNode[p.second])continue;
    used[p.second]=true;
    sumCost+=p.first;
    for(int i=0;i<(int)G[p.second].size();i++){
      edge &e=G[p.second][i];
      if(used[e.to])continue;
      if(noNode[p.second])continue;
      pq.push(pii(e.cost,e.to));
    }
  }
  for(int i=0;i<N;i++)
    if(!used[i]&&!noNode[i])return -1;
  return sumCost;
}

int makeMST2(int st,vector<int> &v1,vector<int> &v2){
  int sumCost=0;
  priority_queue<pii,vector<pii>,greater<pii> > pq;
  bool used[201]={};
  bool oks[201]={};
  for(int i=0;i<(int)v2.size();i++)
    oks[v2[i]]=true;
  for(int i=0;i<(int)v1.size();i++){
    used[v1[i]]=true;
    for(int j=0;j<(int)G[v1[i]].size();j++){
      edge &e=G[v1[i]][j];
      int to=e.to;
      int cost=e.cost;
      pq.push(pii(cost,to));
    }
  }
  // まだ決まっていないノードを使ってエッジを埋めていく
  while(pq.size()){
    pii p=pq.top();pq.pop();
    if(used[p.second])continue;
    if(!oks[p.second])continue;
    used[p.second]=true;
    sumCost+=p.first;
    for(int i=0;i<(int)G[p.second].size();i++){
      edge &e=G[p.second][i];
      if(used[e.to])continue;
      if(!oks[p.second])continue;
      pq.push(pii(e.cost,e.to));
    }
  }
  return sumCost;
}

int mst(int st){
  int sumCost=0;
  priority_queue<pii,vector<pii>,greater<pii> > pq;
  bool used[201]={};
  pq.push(pii(0,st));
  used[st]=true;
  for(int i=0;i<(int)G[st].size();i++){
    edge &e=G[st][i];
    if(used[e.to])continue;
    pq.push(pii(e.cost,e.to));
  }
  while(pq.size()){
    pii p=pq.top();pq.pop();
    int to=p.second;
    int cost=p.first;
    if(used[to])continue;
    if(noNode[to])continue;
    used[to]=true;
    sumCost+=cost;
    for(int i=0;i<(int)G[to].size();i++){
      edge &e=G[to][i];
      if(used[e.to])continue;
      if(noNode[e.to])continue;
      pq.push(pii(e.cost,e.to));
    }
  }
  for(int i=0;i<N;i++)
    if(!noNode[i]&&!used[i])return -1;
  return sumCost;
}


int main(){
  while(cin>>N>>M&&(N|M)){
    map<int,vector<int> > m;
    for(int i=0;i<N;i++){
      G[i].clear();
      cin>>hs[i].first;
      hs[i].second=i;
      m[hs[i].first].push_back(i);
    }
    for(int i=0;i<M;i++){
      int a,b,c;
      cin>>a>>b>>c;
      a--;b--;
      G[a].push_back(edge(b,c));
      G[b].push_back(edge(a,c));
    }
    memset(noNode,0,sizeof(noNode));
    vector<vector<int> > v;
    for(map<int,vector<int> >::iterator it=m.begin();
        it!=m.end();it++)
      v.push_back(it->second);
    int idx=(int)v.size();
    // それぞれの時間単位で、だめな条件を考える
    for(int i=0;i<(int)v.size();i++){
      //int res=makeMST(v[i][0]);
      int res=mst(v[i][0]);
      if(res==-1){
        idx=i;
        break;
      }
      for(int j=0;j<(int)v[i].size();j++)
        noNode[v[i][j]]=true;
    }
    if(idx==0){
      cout<<0<<endl;
      continue;
    }
    // [0,idx)なら作成が可能なので、その範囲で考えていく
    // idxまでの時点でまずMSTを作成
    // 次に作ったMSTにエッジを張っていく
    memset(noNode,0,sizeof(noNode));
    for(int i=0;i<idx-1;i++)
      for(int j=0;j<(int)v[i].size();j++)
        noNode[v[i][j]]=true;
    int st=-1;
    for(int i=0;i<N;i++)
      if(!noNode[i])st=i;
    int val=makeMST(st);
    // 次に、idxから順番にedgeを張っていく
    // vectorでまとめて私
    // mstを行う
    for(int i=idx-2;i>=0;i--){
      for(int j=0;j<(int)v[i].size();j++)noNode[v[i][j]]=false;
      int st=-1;
      for(int j=0;j<N;j++)if(!noNode[j])st=j;
      vector<int> a;
      for(int j=i+1;j<(int)v.size();j++)for(int k=0;k<(int)v[j].size();k++)a.push_back(v[j][k]);
      val+=makeMST2(st,a,v[i]);
    }
    cout<<val<<endl;
  }
  
  return 0;
}

Measured memory_bytes: 2352