#include <bits/stdc++.h>   using namespace std;   long long mod = 1000000007;   vector<long long> parent(200005), Size(200005, 1);   long long answer = 0;   long long find_set(long long n) {     if (parent[n] == n)       return n;     else       return find_set(parent[n]);   }   void add_edge(long long a, long long b) {     long long A = find_set(a);     long long B = find_set(b);     if (Size[A] >= Size[B]) {       answer -= ((Size[A] * (Size[A] - 1)) / 2);       answer -= ((Size[B] * (Size[B] - 1)) / 2);       Size[A] += Size[B];       Size[B] = 0;       parent[B] = A;       answer += ((Size[A] * (Size[A] - 1)) / 2);     } else {       answer -= ((Size[B] * (Size[B] - 1)) / 2);       answer -= ((Size[A] * (Size[A] - 1)) / 2);       Size[B] += Size[A];       Size[A] = 0;       parent[A] = B;       answer += ((Size[B] * (Size[B] - 1)) / 2);     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     long long N, Q, p, q, r;     cin >> N >> Q;     if (N == 1) {       for (long long i = 1; i <= Q; i++) cout <<  0  ;       return 0;     }     for (long long i = 1; i <= N; i++) parent[i] = i;     vector<pair<long long, pair<long long, long long>>> G;     for (long long i = 1; i < N; i++) {       cin >> p >> q >> r;       G.push_back({r, {p, q}});     }     sort(G.begin(), G.end());     vector<long long> final_ans(N + 1);     long long ptr = 0;     for (long long i = 1; i <= N;) {       if (G[ptr].first == i) {         add_edge(G[ptr].second.first, G[ptr].second.second);         ptr++;       } else {         final_ans[i] = answer;         i++;       }     }     while (Q--) {       long long k;       cin >> k;       cout << final_ans[k] <<    ;     }     return 0;   }   