#include <bits/stdc++.h>
using namespace std;
void setup()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
struct DSU
{
int par[500], sz[500];
inline void Init()
{
for (int i = 0; i < 500; ++i)
{
par[i] = i;
sz[i] = 1;
}
}
inline int Get(int inp)
{
return (inp == par[inp] ? inp : par[inp] = Get(par[inp]));
}
inline void Combine(int a, int b)
{
a = Get(a);
b = Get(b);
if (a != b)
{
if (sz[a] < sz[b])
{
swap(a, b);
}
par[b] = a;
sz[a] += sz[b];
}
}
} dsu;
int n, m, q, cur, x;
long long val, num;
array<int, 3> edge[100000];
vector<array<int, 3>> timeline;
inline bool Comp(array<int, 3> &ina, array<int, 3> &inb)
{
return ina[2] < inb[2];
}
int main()
{
setup();
cin >> n >> m;
for (int i = 0; i < m; ++i)
{
cin >> edge[i][0] >> edge[i][1] >> edge[i][2];
edge[i][0]--;
edge[i][1]--;
}
sort(edge, edge + m, Comp);
for (int i = 0, j; i < m; ++i)
{
dsu.Init();
for (j = i - 1; 0 <= j; --j)
{
dsu.Combine(edge[j][0], edge[j][1]);
if (dsu.Get(edge[i][0]) == dsu.Get(edge[i][1]))
{
break;
}
}
if (j == -1)
{
timeline.push_back({0, -1, edge[i][2]});
}
else
{
timeline.push_back({(edge[i][2] + edge[j][2] + 1) / 2, -2, edge[j][2] + edge[i][2]});
}
timeline.push_back({edge[i][2], 1, -edge[i][2]});
timeline.push_back({edge[i][2] + 1, 1, -edge[i][2]});
}
sort(timeline.begin(), timeline.end());
cin >> q;
while (q--)
{
cin >> x;
while (cur < timeline.size() && timeline[cur][0] <= x)
{
num += timeline[cur][1];
val += timeline[cur][2];
cur++;
}
cout << val + num * x << "\n";
}
return 0;
}