#include <bits/stdc++.h>
using namespace std;
#define all(a) a.begin(), a.end()
#define el "\n"
#define int long long
const int INF = LLONG_MIN;
vector<vector<int>> adj;
vector<int> a;
int dp[100005][305];
void dfs(int node, int par, int k) {
vector<int> children;
for (int child : adj[node]) {
if (child != par) {
dfs(child, node, k);
children.push_back(child);
}
}
// Base case: No steps taken, only the node value itself
dp[node][0] = a[node];
// Merge children DP states
for (int i = 1; i <= k; i++) {
int best = INF;
for (int child : children) {
if (i - 1 >= 0) {
best = max(best, dp[child][i - 1] + a[node]);
}
}
dp[node][i] = best;
}
}
void solve() {
int n, k;
cin >> n >> k;
a.resize(n);
adj.assign(n, vector<int>());
for (int &x : a) cin >> x;
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
u--, v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
// Initialize DP table
for (int i = 0; i < n; i++)
for (int j = 0; j <= k; j++)
dp[i][j] = INF;
dfs(0, -1, k);
// Find the best answer among all nodes
int ans = INF;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= k; j++) {
ans = max(ans, dp[i][j]);
}
}
if (ans < 0) ans = -1;
cout << ans << el;
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t = 1;
while (t--) {
solve();
}
return 0;
}