//时间限制3kms,第一开始用ios::sync_with_stdio(false)
//一直TLE,后来用scanf竟然590ms就过了。。。
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=5e4+10;
#define INF 1000000000000
struct Edge{//链式前向星存图
int to,next,w;
}edge[maxn<<1];//无向图 双向 所以乘2
int head[maxn];
struct Node{
int u;
long long dis;
}now,temp;
bool operator< (Node a,Node b){
return a.dis>b.dis;
}
int weight[maxn];
bool visit[maxn];
long long dis[maxn];//第一个点到其他点的最小距离,也就是Dijsktra的核心算法
void Dijkstra(int s){
int i,v;
dis[s]=0;
priority_queue<Node> pq;
temp.dis=0,temp.u=s;
pq.push(temp);
while(!pq.empty()){
temp=pq.top();
pq.pop();
if(visit[temp.u]==true)
continue;
visit[temp.u]=true;
for(i=head[temp.u];i!=-1;i=edge[i].next){
v=edge[i].to;
if(visit[v]==false&&dis[v]>dis[temp.u]+edge[i].w){
dis[v]=dis[temp.u]+edge[i].w;
now.u=v;
now.dis=dis[v];
pq.push(now);
}
}
}
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("E:\\input.txt","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&weight[i]);
int id=0;
for(int i=0;i<=n;i++){//初始化
visit[i]=false;
dis[i]=INF;
head[i]=-1;
}
int t1,t2,t3;
for(int i=0;i<m;i++){
scanf("%d%d%d",&t1,&t2,&t3);
t1--,t2--;
edge[id].to=t2;
edge[id].w=t3;
edge[id].next=head[t1];
head[t1]=id++;
edge[id].to=t1;
edge[id].w=t3;
edge[id].next=head[t2];
head[t2]=id++;
}
Dijkstra(0);
long long res=0;
int i;
for(i=0;i<n;i++){
if(dis[i]==INF)
break;
res+=dis[i]*weight[i];
}
if(i<n)
printf("No Answer\n");
else
printf("%lld\n",res);
}
return 0;
}