#include <bits/stdc++.h>
using namespace std;
struct edge {
int u, v, w;
bool operator<(const edge &r) const {
if (w != r.w) {
return w < r.w;
}
if (u != r.u) {
return u < r.u;
}
return v < r.v;
}
};
class Dsu {
int n;
vector<int> par;
public:
Dsu(int n) : n(n), par(n) {
iota(par.begin(), par.end(), 0);
}
int root(int u) { return u == par[u] ? u : par[u] = root(par[u]); }
void merge(int u, int v) {
u = root(u), v = root(v);
if (u != v) {
par[v] = u;
}
}
};
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m;
cin >> n >> m;
vector<edge> edges(m);
for (auto &[u, v, w] : edges) {
cin >> u >> v >> w;
}
sort(edges.begin(), edges.end());
vector<pair<int, int>> ev1, ev2;
auto add = [&](int l, int r, int w) {
vector<pair<int, int>> ends;
if (r < w || w < l) {
ends.push_back({l, r});
} else {
ends.push_back({l, w});
if (w + 1 <= r) {
ends.push_back({w + 1, r});
}
}
for (auto &[l, r] : ends) {
if (r <= w) { // [l,r] w, so we add w-i
ev1.push_back({l, w}), ev1.push_back({r + 1, -w});
ev2.push_back({l, -1}), ev2.push_back({r + 1, 1});
} else { // w [l,r], so we add i-w
ev1.push_back({l, -w}), ev1.push_back({r + 1, w});
ev2.push_back({l, 1}), ev2.push_back({r + 1, -1});
}
}
};
for (int i = 0; i < m; ++i) {
auto [u, v, w] = edges[i];
Dsu dsu(n + 1);
int r = int(1e9);
for (int j = i + 1; j < m; ++j) {
dsu.merge(edges[j].u, edges[j].v);
if (dsu.root(u) == dsu.root(v)) {
r = (w + edges[j].w - 1) / 2;
break;
}
}
dsu = Dsu(n + 1);
int l = int(-1e9);
for (int j = i - 1; j >= 0; --j) {
dsu.merge(edges[j].u, edges[j].v);
if (dsu.root(u) == dsu.root(v)) {
l = (w + edges[j].w + 1) / 2;
break;
}
}
add(l, r, w);
}
sort(ev1.rbegin(), ev1.rend());
sort(ev2.rbegin(), ev2.rend());
int q;
cin >> q;
int64_t ans = 0, is = 0;
while (q--) {
int x;
cin >> x;
while (!ev1.empty() && ev1.back().first <= x) {
ans += ev1.back().second;
ev1.pop_back();
}
while (!ev2.empty() && ev2.back().first <= x) {
is += ev2.back().second;
ev2.pop_back();
}
cout << ans + is * x << '\n';
}
}