#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 505;
vector<int> nei[N], vec;
int dp[2 * N][N], a[N], fst[N], lst[2 * N], Par[N];
void dfs(int u, int p){
Par[u] = p;
for (int i : nei[u])
if (i != p)
dfs(i, u);
}
void sendToLast(int v){
while (v - 1){
int p = Par[v];
nei[p].erase(find(begin(nei[p]), end(nei[p]), v));
nei[p].push_back(v);
v = p;
}
}
void getOrder(int u){
fst[u] = vec.size();
vec.push_back(u);
for (int i : nei[u])
if (i != Par[u])
getOrder(i), vec.push_back(u);
}
int main(){
int n, m, Ans = 0;
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>a[i];
for (int i=1;i<n;i++){
int u, v;
cin>>u>>v;
nei[u].push_back(v);
nei[v].push_back(u);
}
dfs(1, 0);
for (int l=1;l<=n;l++){
sendToLast(l);
vec = {};
getOrder(1);
for (int i=0;i<vec.size();i++){
for (int j=0;j<=m;j++)
dp[i][j] = -1e9;
}
dp[0][0] = 0;
for (int i=0;i<vec.size();i++){
if (fst[vec[i]] == i){
for (int j=m-1;j>=0;j--)
dp[i][j+1] = max(dp[i][j+1], dp[i][j] + a[vec[i]]), Ans = max(Ans, dp[i][j+1]);
}
else{
for (int j=0;j<=m;j++)
dp[i][j] = max(dp[i][j], dp[lst[vec[i]]][j]);
}
lst[vec[i]] = i;
for (int j=0;j<=m;j++)
dp[i+1][j+1] = max(dp[i+1][j+1], dp[i][j]);
}
}
cout<<Ans<<'\n';
}