#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
const int MAXK = 300;
const long long INF = 1e18;
int A[MAXN + 5];
long long dp[MAXN + 5][MAXK + 2], down[MAXN + 5][MAXK + 2];
vector<int> X[MAXN + 5];
void dfs(int u, int par, int k)
{
down[u][1] = dp[u][1] = A[u];
for (int i = 2; i <= k; i++)
dp[u][i] = down[u][i] = -INF;
int a = -1, b = -1;
for (int v: X[u])
if (v != par)
{
dfs(v, u, k);
if (a == -1)
a = v;
else
b = v;
for (int i = 1; i <= k; i++)
{
dp[u][i] = max(dp[u][i], dp[v][i]);
down[u][i] = max(down[u][i], down[v][i - 1] + A[u]);
}
}
for (int i = 1; i <= k; i++)
{
dp[u][i] = max(dp[u][i], down[u][i]);
if (b != -1)
{
for (int j = 1; j <= i - j - 1; j++)
{
dp[u][i] = max(dp[u][i], down[a][j] + down[b][i - j - 1] + A[u]);
dp[u][i] = max(dp[u][i], down[b][j] + down[a][i - j - 1] + A[u]);
}
}
if (dp[u][i] < 0)
dp[u][i] = -INF;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(NULL), cout.tie(NULL);
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> A[i];
for (int i = 1; i <= n - 1; i++)
{
int u, v;
cin >> u >> v;
X[u].push_back(v);
X[v].push_back(u);
}
dfs(1, 0, k);
long long res = max(0LL, dp[1][k]);
cout << res << "\n";
return 0;
}