/*
* Copyright (c) 2025 Emon Thakur
* All rights reserved.
*/
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll a[100005],n,k,dp[100005][101],dp2[100005][101];
vector<ll> g[100005];
void dpontree(int node,int par)
{
dp[node][1] = a[node];
dp[node][0] = 0;
for(int e:g[node])
{
if(e==par) continue;
dpontree(e,node);
}
for(int i=2;i<=k;i++)
{
for(int 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]);
}
}
}
void rerooting(int node,int par)
{
vector<ll> mx(k),mx2(k);
for(int i=1;i<k;i++)
{
for(auto e:g[node])
{
if(e==par || dp[e][i-1]==0) continue;
if(dp[e][i-1]+a[node] >= mx[i])
{
mx2[i] = mx[i];
mx[i] = dp[e][i-1]+a[node];
}
else if(dp[e][i-1]+a[node] > mx2[i])
{
mx2[i] = dp[e][i-1]+a[node];
}
}
if(dp2[node][i]>=mx[i]) mx2[i] = mx[i], mx[i] = dp2[node][i];
else if(dp2[node][i]>mx2[i]) mx2[i] = dp2[node][i];
}
for(auto e:g[node])
{
if(e==par) continue;
for(int i=1;i<k;i++)
{
if(dp[node][1]+dp[e][i-1]==mx[i]) dp2[e][i+1] = (mx2[i])? mx2[i] + a[e]: 0;
else dp2[e][i+1] = (mx[i])? mx[i] + a[e]: 0;
}
rerooting(e,node);
}
}
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));
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<n;i++)
{
int u,v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dpontree(1,0);
dp2[1][1] = a[1];
rerooting(1,0);
ll ans = 0;
for(int i=1;i<=n;i++) ans = max({ans , dp[i][k], dp2[i][k]});
cout<<ans<<'\n';
//file<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr);
//int x = 49 ;
solve(0);
}