/*
* Copyright (c) 2025 Emon Thakur
* All rights reserved.
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define cout file
vector<int> g[100005];
ll a[100005],n,k,dp[100005][301],ans=0;
void dfs(int node,int par)
{
dp[node][1] = a[node];
dp[node][0] = 0;
for(int e:g[node])
{
if(e==par) continue;
dfs(e,node);
}
for(int i=2;i<=k;i++)
{
for(auto e:g[node])
{
if(e==par) continue;
if(dp[e][i-1]) dp[node][i] = max(dp[node][i] , dp[e][i-1]+a[node]);
}
}
if(g[node].size()==3 || (node==1 && g[1].size()==2))
{
vector<int>nodes;
for(auto e:g[node])
{
if(e==par) continue;
nodes.push_back(e);
}
int node1=nodes[0],node2 = nodes[1];
for(int i=1;i<k-1;i++)
{
if(dp[node1][i] && dp[node2][k-i-1])
dp[node][k] = max(dp[node][k] , dp[node1][i] + a[node] + dp[node2][k-i-1]);
}
}
ans = max(ans , dp[node][k]);
}
int height(int node,int par)
{
int mx = 0;
for(auto e:g[node])
{
if(e==par) continue;
mx = max(mx , height(e,node));
}
return mx+1;
}
void solve(int tc)
{
// string outp = "output"+to_string(tc)+".txt";
// string inp = "input"+to_string(tc)+".txt";
// ofstream file(outp);
// freopen(inp.c_str(),"r",stdin);
// memset(dp,0,sizeof(dp));
ans = 0;
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=0;i<n-1;i++)
{
int u,v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0);
//for(int i=1;i<=n;i++) cout<<dp[i][k]<<endl;
//cout<<height(1,0)<<endl;
cout<<ans<<'\n';
//file<<ans<<'\n';
//for(int i=1;i<=n;i++) g[i].clear();
}
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr);
// ll x = 32;
// for(int i=x;i<=x;i++) solve(i);
solve(0);
}