#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 18;
pair<int, pair<int, int> > p[N];
struct node {
  int cnt, fa;
} f[N];
long long ans[N];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1, u, v, w; i < n; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    p[i] = {w, {u, v}};
  }
  sort(p + 1, p + n);
  for (int i = 1; i <= n; ++i) f[i] = {1, i};
  function<int(int)> Find = [&](int x) {
    return x == f[x].fa ? x : f[x].fa = Find(f[x].fa);
  };
  function<long long(int, int)> mer = [&](int u, int v) {
    u = Find(u), v = Find(v);
    if (u == v) return 0LL;
    long long ret = 1LL * f[u].cnt * f[v].cnt;
    f[v].fa = u;
    f[u].cnt += f[v].cnt;
    return ret;
  };
  long long tp = 0;
  int np = 1;
  for (int now = 1, nw; now < n;) {
    nw = p[now].first;
    while (now < n && p[now].first == nw) {
      int u = p[now].second.first, v = p[now].second.second;
      tp += mer(u, v);
      now++;
    }
    while (np < nw) ans[np] = ans[np - 1], ++np;
    ans[np++] = tp;
  }
  while (np < N) ans[np] = ans[np - 1], ++np;
  for (int i = 0, x; i < m; ++i) {
    scanf("%d", &x);
    printf("%lld%c", ans[x], " \n"[i == m - 1]);
  }
}
