#include using namespace std; struct edge { int next; long long cost; }; const long long inf = 1e17; int n, m; vector g[200]; long long u[200]; long long dp[222][1010]; void chmax(long long &a, long long b) { if (a < b) a = b; } void dfs(int curr, int prev) { for (int i = 0; i < 1010; i++) { dp[curr][i] = -inf; } dp[curr][0] = u[curr]; for (edge e : g[curr]) if (e.next != prev) { dfs(e.next, curr); for (int i = 1000; i >= 0; i--) { if (dp[curr][i] == inf) continue; for (int j = 0; i + j + e.cost <= 1000; j++) { chmax(dp[curr][i + j + e.cost], dp[curr][i] + dp[e.next][j]); } } } } int main() { cin >> n >> m; m /= 2; for (int i = 0; i < n; i++) { scanf("%lld", &u[i]); } for (int i = 0; i < n - 1; i++) { int a, b, c; scanf("%d %d %d", &a, &b, &c); g[a].push_back({ b, c }); g[b].push_back({ a, c }); } dfs(0, -1); long long ans = 0; for (int i = 0; i <= m; i++) chmax(ans, dp[0][i]); cout << ans << endl; }