#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] = dp[u][1] = A[u];
for (int i = 2; i <= k; i++)
dp[u][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++)
{
dp[u][i] = max(dp[u][i], dp[v][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();
}
}
vector<long long> maxx(k + 1), max2(k + 1);
for (int i = 1; i <= k; i++)
{
if (q[i].empty())
maxx[i] = max2[i] = -INF;
else if (q[i].size() == 1)
maxx[i] = q[i].top(), max2[i] = -INF;
else
{
max2[i] = q[i].top();
q[i].pop();
maxx[i] = q[i].top();
}
}
for (int i = 1; i <= k; i++)
{
dp[u][i] = max(dp[u][i], down[u][i]);
for (int v: X[u])
if (v != par)
{
for (int j = 1; j <= i - j - 1; j++)
{
long long p1 = down[v][j];
long long p2 = maxx[i - j - 1];
if (p2 == down[v][i - j - 1])
p2 = max2[i - j - 1];
dp[u][i] = max(dp[u][i], p1 + p2 + 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);
long long res = max(0LL, dp[1][k]);
cout << res << "\n";
return 0;
}