#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
const int maxn=10050;
const int maxm=500050;
const ll mod=1e9+7;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node{
int x,y,val;
bool operator <(const node &b) const{
return val<b.val;
}
}a[maxm];
struct qes{
int id,v,ans;
bool operator <(const qes &b) const{
return v<b.v;
}
}q[maxm];
int fa[maxn],num[maxn],ANS[maxm];
int sum;
int getfa(int x){
if(fa[x]==x) return x;
return fa[x]=getfa(fa[x]);
}
void uni(int x,int y){
x=getfa(x);
y=getfa(y);
if(x==y) return;
sum+=num[x]*num[y]*2;
num[x]+=num[y];
fa[y]=x;
}
int main(){
int T,n,m;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
num[i]=1;
fa[i]=i;
}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].val);
a[i].x++;
a[i].y++;
}
int Q;
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
scanf("%d",&q[i].v);
q[i].id=i;
q[i].ans=0;
}
sort(q+1,q+1+Q);
sort(a+1,a+1+m);
int now=1;
sum=0;
for(int i=1;i<=m;i++){
int limit=a[i].val;
while(now<=Q&&q[now].v<=limit){
q[now].ans=sum;
now++;
}
uni(a[i].x,a[i].y);
}
while(now<=Q){
q[now].ans=sum;
now++;
}
for(int i=1;i<=Q;i++){
ANS[q[i].id]=sum-q[i].ans;
}
for(int i=1;i<=Q;i++) printf("%d\n",ANS[i]);
}
return 0;
}
/*
2
2 1
0 1 2
3
1
2
3
3 3
0 1 2
0 2 4
1 2 5
5
0
2
3
4
5
*/