#include //#include using namespace std; // using namespace atcoder; // using mint = modint1000000007; // const int mod = 1000000007; // using mint = modint998244353; // const int mod = 998244353; // const int INF = 1e9; // const long long LINF = 1e18; #define rep(i, n) for (int i = 0; i < (n); ++i) #define rep2(i, l, r) for (int i = (l); i < (r); ++i) #define rrep(i, n) for (int i = (n)-1; i >= 0; --i) #define rrep2(i, l, r) for (int i = (r)-1; i >= (l); --i) #define all(x) (x).begin(), (x).end() #define allR(x) (x).rbegin(), (x).rend() #define P pair template inline bool chmax(A &a, const B &b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(A &a, const B &b) { if (a > b) { a = b; return true; } return false; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n, t; cin >> n >> t; int m = t / 2; vectora(n); rep(i, n)cin >> a[i]; vector>> e(n); rep(i, n - 1) { int u, v, c; cin >> u >> v >> c; e[u].push_back({ v, c }); e[v].push_back({ u, c }); } vector> g(n); vector w(n, 0); { vector parent(n, -1); stack st; st.push(0); while (!st.empty()) { auto v = st.top(); st.pop(); for (auto[nv, cost] : e[v]) { if (nv == parent[v])continue; parent[nv] = v; w[nv] = cost; g[v].push_back(nv); st.push(nv); } } } auto dfs = [&](auto&& self, int v, vector dp)-> vector { vector nxt(m + 1, -1); for (int i = m - w[v]; i >= 0; i--) { if (dp[i] == -1) continue; chmax(nxt[i + w[v]], dp[i] + a[v]); } for (int nv : g[v]) nxt = self(self, nv, move(nxt)); rep(i, m + 1) chmax(dp[i], nxt[i]); return dp; }; vectordp(m + 1, -1); dp[0] = 0; dp = dfs(dfs, 0, move(dp)); auto ans = *max_element(all(dp)); cout << ans << endl; return 0; }