#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
const int MAXK = 100;
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] = A[u];
for (int i = 2; i <= k; i++)
down[u][i] = -INF;
vector< priority_queue<long long, vector<long long>, greater<> > > q(k + 1);
for (int v: X[u])
if (v != par)
{
dfs(v, u, k);
for (int i = 1; i <= k; i++)
{
down[u][i] = max(down[u][i], down[v][i - 1] + A[u]);
q[i].push(down[v][i]);
if (q[i].size() > 2)
q[i].pop();
}
}
for (int i = 1; i <= k; i++)
{
dp[u][i] = down[u][i];
for (int j = 1; j <= k - j - 1; j++)
{
if (j != k - j - 1 && !q[j].empty() && !q[k - j - 1].empty())
dp[u][i] = max(dp[u][i], q[j].top() + q[k - j - 1].top() + A[u]);
else if (q[j].size() == 2)
{
long long maxx = q[j].top();
q[j].pop();
long long max2 = q[j].top();
q[j].push(maxx);
dp[u][i] = max(dp[u][i], maxx + max2 + A[u]);
}
}
}
}
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);
cout << dp[1][k] << "\n";
return 0;
}