#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;
int dp[MAXN][MAXK]; // DP table
bool visited[MAXN]; // To track visited nodes
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);
// Update dp[node] for all lengths up to K
for (int length = K; length > 0; --length) {
for (int l = 0; l < length; ++l) {
dp[node][length] = max(dp[node][length], dp[node][l] + dp[neighbor][length - l - 1]);
}
}
}
}
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;
}