#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=505;
int v,e;
struct Vertex
{
void set_value(int x,int y,int c);
int v1,v2,cost;
bool operator<(Vertex obj) const;
}edge[maxn*maxn/2];
int fa[maxn];
void init()
{
for(int i=0;i<=v;i++)
fa[i]=i;
}
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void unite(int x,int y)
{
int rx=find(x);
int ry=find(y);
if(fa[rx]!=fa[ry])
fa[rx]=ry;
}
int kruscal()
{
init();
int ans=edge[0].cost,cnt=1;
unite(edge[0].v1,edge[0].v2);
for(int i=1;i<e&&cnt<v;i++)
{
int r1=find(edge[i].v1);
int r2=find(edge[i].v2); //2 root
if(r1!=r2) //if no circles
{
unite(r1,r2);
ans+=edge[i].cost;
cnt++;
}
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>v>>e;
for(int i=0;i<e;i++)
{
int x,y,c;
cin>>x>>y>>c;
edge[i].set_value(x,y,c);
}
sort(edge,edge+e);
int ans=kruscal();
int min_num=0x3fffffff;
for(int i=1;i<=v;i++)
{
int num;
cin>>num;
min_num=min(min_num,num);
}
ans+=min_num;
cout<<ans<<endl;
}
}
void Vertex::set_value(int x,int y,int c)
{
v1=x,v2=y,cost=c;
}
bool Vertex::operator<(Vertex obj) const
{
return cost<obj.cost;
}