#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int64_t ans, INF = -1e18;
int a[N], n, k;
vector<int> g[N];
vector<int64_t> dfs(int node, int pr = -1) {
vector<int64_t> dp(k + 1, INF);
dp[1] = a[node];
for (auto &son : g[node]) {
if (son == pr) continue;
vector<int64_t> cdp = dfs(son, node);
for (int i = 2; i <= k; i++) {
if (cdp[i - 1] != INF) {
dp[i] = max(dp[i], cdp[i - 1] + dp[1]);
}
}
}
ans = max(ans, dp[k]);
return dp;
}
void solve(int cs) {
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
ans = INF;
dfs(1);
cout << (ans == INF ? 0 : ans) << "\n";
}
int32_t main() {
ios::sync_with_stdio(!cin.tie(0));
int t = 1;
// cin >> t;
for (int i = 1; i <= t; ++i) {
solve(i);
}
return 0;
}