#include<bits/stdc++.h>
using namespace std;
#define all(a) a.begin(),a.end()
#define el "\n"
#define int long long
// Optimized prime check
bool isprime(int n){
if(n < 2) return false;
if(n == 2 || n == 3) return true;
if(n % 2 == 0 || n % 3 == 0) return false;
for(int i = 5; i * i <= n; i += 6) {
if(n % i == 0 || n % (i + 2) == 0) return false;
}
return true;
}
int dp[100005][305];
void chori_ka_laptop(){
// for all node find for left
int n; cin>>n;
int k; cin>>k;
vector<int>a(n);
vector<vector<int>>adj(n);
for(auto &i:a) cin>>i;
for(int i=0;i<n-1;i++){
int x,y; cin>>x>>y;
x--,y--;
adj[x].push_back(y);
adj[y].push_back(x);
}
for(int i=0;i<=n;i++){
for(int cur=0;cur<=k;cur++){
dp[i][cur]=-1e15;
}
}
int ans=-1e15;
auto dfs=[&](auto &&self,int node,int par)->void{
for(auto i:adj[node]){
if(i==par )continue;
self(self,i,node);
}
vector<vector<int>>v;
v.push_back({0,0,0,0});
for(int j=0;j<=k-1;j++){
int maxi=-1e15; int second_maxi=-1e15;
int max_index=-1; int second_max_index=-1;
int p=1;
for(auto i:adj[node]){
if(i==par) continue;
p++;
int cur=dp[i][j]+a[i];
if(cur>maxi){
second_maxi=maxi;
second_max_index=max_index;
maxi=cur;
max_index=p;
}
else if(cur>second_maxi){
second_maxi=cur;
second_max_index=p;
}}
v.push_back({maxi,second_maxi,max_index,second_max_index});
}
dp[node][0]=0;
for(int j=0;j<=k-1;j++){
int recip=k-1-j;
int index=v[j][2];
if(v[recip][2]!=index){
ans=max(v[j][0]+v[recip][0]+a[node],ans);
}
else ans=max(v[j][0]+v[recip][1]+a[node],ans);
dp[node][j+1]=v[j][0];
}
};
dfs(dfs,0,-1);
if(ans<0) ans=0;
cout<<ans<<el;
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
// #ifndef ONLINE_JUDGE
// freopen("input1.txt", "r", stdin);
// freopen("D://sublime text//output6.txt", "w", stdout);
// #endif
int t = 1;
//cin >> t;
while(t--) {
chori_ka_laptop();
}
return 0;
}