#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
const int MAXK = 305;
int N, K;
vector<int> adj[MAXN];
vector<int> values;
// DP table: dp[node][length] stores the max sum of a path of length `length` ending at `node`
int dp[MAXN][MAXK];
void dfs(int node, int parent) {
dp[node][0] = values[node]; // Path of length 0 is just the node itself
for (int neighbor : adj[node]) {
if (neighbor == parent) continue; // Avoid revisiting parent
dfs(neighbor, node);
// Temporary DP array to store updates
int temp[MAXK] = {0};
for (int len1 = 0; len1 < K; ++len1) {
for (int len2 = 0; len1 + len2 + 1 <= K; ++len2) {
temp[len1 + len2 + 1] = max(temp[len1 + len2 + 1], dp[node][len1] + dp[neighbor][len2]);
}
}
// Copy temp back to dp[node]
for (int len = 0; len <= K; ++len) {
dp[node][len] = max(dp[node][len], temp[len]);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> K;
values.resize(N + 1);
for (int i = 1; i <= N; ++i) cin >> values[i];
for (int i = 1; i < N; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
memset(dp, 0, sizeof(dp));
dfs(1, -1); // Start DFS from root (node 1)
int maxWeight = 0;
for (int i = 1; i <= N; ++i) {
maxWeight = max(maxWeight, dp[i][K]);
}
cout << maxWeight << "\n";
return 0;
}