#include
using namespace std;
typedef long long ll;
const int maxn = 5e4 + 10;
const int maxk = 155;
const ll INF = 1e18;
int n, k;
vector graph[maxn];
ll v[maxn];
vector top_sort;
int subtree_size[maxn];
ll dp[maxn][maxk];
void dfs(int node, int parent) {
subtree_size[node] = 1;
for(int neighbour : graph[node]) {
if(neighbour != parent) {
dfs(neighbour, node);
subtree_size[node] += subtree_size[neighbour];
}
}
top_sort.push_back(node);
}
int main()
{
ios_base::sync_with_stdio(false);
cin >> n >> k;
for(int i = 0; i < n; i++) {
cin >> v[i];
}
for(int i = 1; i < n; i++) {
int a, b;
cin >> a >> b;
a--; b--;
graph[a].push_back(b);
graph[b].push_back(a);
}
dfs(0, -1);
reverse(top_sort.begin(), top_sort.end());
for(int i = 0; i < maxn; i++) {
for(int j = 0; j < maxk; j++) {
dp[i][j] = -INF;
}
}
dp[0][k] = 0;
for(int i = 0; i < n; i++) {
int node = top_sort[i];
for(int j = 0; j <= k; j++) {
if(dp[i][j] == -INF) continue;
dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + v[node]);
if(j >= 1) {
dp[i + subtree_size[node]][j - 1] = max(dp[i + subtree_size[node]][j - 1], dp[i][j]);
}
}
}
ll res = -INF;
for(int j = 0; j <= k; j++) {
res = max(res, dp[n][j]);
}
cout << res << endl;
return 0;
}