#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][2][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 j=0;j<2;j++){
for(int cur=0;cur<=k;cur++){
dp[i][j][cur]=-1e9;
}
}
}
auto dfs=[&](auto &&self,int node,int par)->void{
for(auto i:adj[node]){
if(i==par )continue;
self(self,i,node);
}
dp[node][0][0]=0;
dp[node][1][0]=0;
vector<int>v;
for(auto i:adj[node]){
if(i==par) continue;
v.push_back(i);
}
if(v.size()==0) return;
for(int i=1;i<=k;i++){
dp[node][0][i]=max(dp[v[0]][0][i-1],dp[v[0]][1][i-1])+
a[v[0]];
;
}
if(v.size()==1) return;
for(int i=1;i<=k;i++){
dp[node][1][i]=max(dp[v[1]][0][i-1],dp[v[1]][1][i-1])+
a[v[1]];
}
};
dfs(dfs,0,-1);
int ans=-1e9;
for(int i=0;i<n;i++){
for(int cur=0; cur<=k-1;cur++){
ans=max(ans,dp[i][0][cur]+dp[i][1][k-cur-1]+a[i]);
}
}
if(ans<0) ans=-1;
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;
}