#include <bits/stdc++.h>
using namespace std;
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
using vi = vector<int>;
using ii = pair<int, int>;
using vii = vector<ii>;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using vb = vector<bool>;
using pll = pair<ll, ll>;
using i128 = __int128;
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
#define pb push_back
#define eb emplace_back
#define fst first
#define snd second
const int MAX_N = 1e5 + 20, MAX_V = 105;
ll dpUp[MAX_N][MAX_V], dpDown[MAX_N][MAX_V];
vi adj[MAX_N];
int p[MAX_N], par[MAX_N];
ll s[MAX_N];
int n, v;
void dfs(int a) {
forsn(i, 1, v + 1) dpUp[a][i] = s[a];
for (int b : adj[a]) if (b != par[a]) {
par[b] = a;
dfs(b);
forn(i, v + 1) dpUp[a][i] = max(dpUp[a][i], dpUp[b][i]);
forsn(i, 1, v + 1) dpUp[a][i] = max(dpUp[a][i], dpUp[b][i - 1] + s[a] - p[b]);
forn(i, v + 1) dpDown[a][i] = max(dpDown[a][i], dpDown[b][i]);
forsn(i, 1, v + 1) dpDown[a][i] = max(dpDown[a][i], dpDown[b][i - 1] + s[b] - p[a]);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> v;
forn(i, n) cin >> p[i];
forn(i, n - 1) {
int a, b;
cin >> a >> b;
--a, --b;
adj[a].pb(b);
adj[b].pb(a);
s[a] += p[b];
s[b] += p[a];
}
dfs(0);
ll ret = 0;
forn(a, n) {
ret = max({ret, dpUp[a][v], dpDown[a][v], v == 0 ? 0 : dpDown[a][v - 1] + s[a]});
const int m = sz(adj[a]);
vector<vll> pref(m + 1, vll(v + 1, 0));
forsn(j, 1, v + 1) pref[0][j] = s[a];
forn(i, m) {
pref[i + 1] = pref[i];
int b = adj[a][i];
if (b == par[a]) continue;
forn(j, v + 1) pref[i + 1][j] = max(pref[i + 1][j], dpUp[b][j]);
forsn(j, 1, v + 1) pref[i + 1][j] = max(pref[i + 1][j], dpUp[b][j - 1] + s[a] - p[b]);
}
vector<vll> suff(m + 1, vll(v + 1, 0));
forsn(j, 1, v + 1) suff[m][j] = s[a];
dforn(i, m) {
suff[i] = suff[i + 1];
int b = adj[a][i];
if (b == par[a]) continue;
forn(j, v + 1) suff[i][j] = max(suff[i][j], dpUp[b][j]);
forsn(j, 1, v + 1) suff[i][j] = max(suff[i][j], dpUp[b][j - 1] + s[a] - p[b]);
}
forn(i, m) {
int b = adj[a][i];
if (b == par[a]) continue;
forn(j, v + 1) {
ll best = max(pref[i][j], suff[i + 1][j]);
ret = max(ret, best + dpDown[b][v - j]);
if (v - j - 1 >= 0) ret = max(ret, best + dpDown[b][v - j - 1] + s[b] - p[a]);
}
}
}
cout << ret << '\n';
return 0;
}