#include <bits/stdc++.h>   using namespace std;   using ll = long long;   const int N = int(2.1e5);   vector<pair<int, int>> g[N];   int n, q;   ll res = 0;   class dsu {    public:     using T = int;     vector<int> p;     vector<ll> sz;     int n;     dsu(int _n) : n(_n) {       p.resize(n);       sz.resize(n);       iota(p.begin(), p.end(), 0);       fill(sz.begin(), sz.end(), 1);     }     inline T get(T x) { return (x == p[x] ? x : (p[x] = get(p[x]))); }     inline bool unite(T x, T y) {       T px = get(x);       T py = get(y);       if (px != py) {         if (sz[px] < sz[py]) {           swap(px, py);         }         p[py] = px;         res -= (sz[px] * (sz[px] - 1)) / 2;         res -= (sz[py] * (sz[py] - 1)) / 2;         sz[px] += sz[py];         res += (sz[px] * (sz[px] - 1)) / 2;         return true;       }       return false;     }   };   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     cin >> n >> q;     vector<pair<int, pair<int, int>>> ed(n - 1);     for (int i = 0; i < n - 1; ++i) {       int u, v, w;       cin >> u >> v >> w;       u--, v--;       ed[i] = {w, {u, v}};     }     sort(ed.begin(), ed.end());     vector<pair<int, int>> qr(q);     for (int i = 0; i < q; ++i) {       int x;       cin >> x;       qr[i] = {x, i};     }     sort(qr.begin(), qr.end());     vector<ll> ans(q);     int j = 0;     dsu d(n + 1);     for (int i = 0; i < q; ++i) {       while (j < n - 1 && ed[j].first <= qr[i].first) {         d.unite(ed[j].second.first, ed[j].second.second);         j++;       }       ans[qr[i].second] = res;     }     for (ll x : ans) {       cout << x <<    ;     }     cout <<   n ;     return 0;   }   