/*
* 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][501],dp2[100005][501];
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)
{
for(int i=1;i<k;i++)
{
ll mx=0,mx2=0;
for(auto e:g[node])
{
if(e==par || dp[e][i-1]==0) continue;
if(dp[e][i-1]+a[node] >= mx)
{
mx2 = mx;
mx = dp[e][i-1]+a[node];
}
else if(dp[e][i-1]+a[node] > mx2)
{
mx2 = dp[e][i-1]+a[node];
}
}
if(dp2[node][i]>=mx) mx2 = mx, mx = dp2[node][i];
else if(dp2[node][i]>mx2) mx2 = dp2[node][i];
for(auto e:g[node])
{
if(e==par) continue;
if(dp[node][1]+dp[e][i-1]==mx) dp2[e][i+1] = (mx2)? mx2 + a[e]: 0;
else dp2[e][i+1] = (mx)? mx + a[e]: 0;
rerooting(e,node);
}
}
}
int main()
{
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<<endl;
}