#include <iostream>
#include <vector>
using namespace std;
const int N = 505;
vector<int> nei[N], G[3 * N];
int dp[3 * N][N], cur, val[N * 3], a[N];
void dfs(int u, int p){
int me = ++cur;
val[me] = a[u];
vector<int> in, out;
for (int i : nei[u]){
if (i == p)
continue;
in.push_back(++cur);
dfs(i, u);
out.push_back(++cur);
}
for (int i=0;i<in.size();i++){
G[me].push_back(in[i]);
for (int j=i+1;j<in.size();j++)
G[out[i]].push_back(in[j]);
G[out[i]].push_back(cur + 1);
}
G[me].push_back(cur + 1);
}
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 i=0;i<=cur;i++)
for (int j=0;j<=m;j++)
dp[i][j] = -1e9;
dp[0][0] = 0;
for (int i=0;i<=cur;i++){
for (int j=0;j<=m;j++)
Ans = max(Ans, dp[i][j]);
G[i].push_back(i + 1);
for (int k : G[i])
for (int j=0;j<=m;j++)
dp[k][j+1] = max(dp[k][j+1], dp[i][j] + val[k]);
}
cout<<Ans<<'\n';
}