#include <iostream>
#include <tuple>
#include <cstdint>
#include <vector>
#include <memory>
//#include <algorithm>
typedef std::tuple<std::uint64_t, std::uint64_t, std::uint64_t> Road;
typedef std::vector<Road> Roads;
typedef std::vector<std::uint64_t> Mountain;
typedef std::tuple<std::uint64_t,std::uint64_t, Mountain, Roads> Input;//money,mountain,roads.
//---
typedef std::shared_ptr < std::uint64_t > Cost;
typedef std::tuple<std::uint64_t, Cost> Line;//MovePos,cost
struct Node{
std::uint64_t V = 0;
std::vector<Line> Road;
};
typedef std::vector< Node > Graph;
Input GetInput() {
std::uint64_t N = 0;
std::uint64_t W = 0;
Mountain M;
std::cin >> N;
std::cin >> W;
std::uint64_t T = 0;
for (std::size_t i = 0; i < N; i++) {
std::cin >> T;
M.push_back(T);
}
std::uint64_t u = 0;
std::uint64_t v = 0;
std::uint64_t c = 0;
Roads R;
for (std::size_t i = 0; i < N; i++) {
std::cin >> u>>v>>c;
R.push_back({u,v,c});
}
return { N,W,M,R };
}
Graph Converte(const Input& I) {
Graph G(std::get<0>(I));
auto& m = std::get<2>(I);
for (std::size_t i = 0; i < std::get<0>(I); i++) {
G[i].V = m[i];
}
for (std::size_t i = 0; i < std::get<0>(I)-1; i++) {
Cost C = std::make_shared<std::uint64_t>(std::get<2>(std::get<3>(I)[i]));
G[std::get<0>(std::get<3>(I)[i]) - 1].Road.push_back({std::get<1>(std::get<3>(I)[i]) - 1, C });
G[std::get<1>(std::get<3>(I)[i]) - 1].Road.push_back({std::get<0>(std::get<3>(I)[i]) - 1, C });
}
return G;
}
std::uint64_t Solve_rec(Graph G, std::size_t IdxA,std::size_t IdxB, std::size_t Depth,std::int64_t Cost,const std::int64_t& Hand,std::int64_t& Max) {
if (Cost < 0) return 0;
if (Hand < 0) return 0;
if (Depth > G.size()*2) return 0;
if (Max < Cost) {
Max = Cost;
}
for (std::size_t i = IdxB; i < G[IdxA].Road.size(); i++) {
std::int64_t MC = *std::get<1>(G[IdxA].Road[i]);
if (MC > Hand) continue;
(*std::get<1>(G[IdxA].Road[i])) = 0;
std::int64_t MV = G[IdxA].V;
G[IdxA].V = 0;
Solve_rec(G, std::get<0>(G[IdxA].Road[i]), 0, Depth + 1, Cost + MV, Hand - MC, Max);
(*std::get<1>(G[IdxA].Road[i])) = MC;
G[IdxA].V = MV;
}
return 0;
}
std::uint64_t Solve(Graph G, std::uint64_t Money) {
std::int64_t Max = 0;
for (std::size_t i = 0; i < G.size(); i++) {
std::int64_t V = G[i].V;
G[i].V = 0;
Solve_rec(G, i, 0, 0,V,Money,Max);
G[i].V = V;
}
return Max;
}
int main() {
Input I = GetInput();
Graph G = Converte(I);
std::int64_t Max = Solve(G, std::get<1>(I));
std::cout << Max << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgovLyNpbmNsdWRlIDxhbGdvcml0aG0+Cgp0eXBlZGVmIHN0ZDo6dHVwbGU8c3RkOjp1aW50NjRfdCwgc3RkOjp1aW50NjRfdCwgc3RkOjp1aW50NjRfdD4gUm9hZDsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxSb2FkPiBSb2FkczsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQ2NF90PiBNb3VudGFpbjsKdHlwZWRlZiBzdGQ6OnR1cGxlPHN0ZDo6dWludDY0X3Qsc3RkOjp1aW50NjRfdCwgTW91bnRhaW4sIFJvYWRzPiBJbnB1dDsvL21vbmV5LG1vdW50YWluLHJvYWRzLgovLy0tLQoKdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHIgPCBzdGQ6OnVpbnQ2NF90ID4gQ29zdDsKdHlwZWRlZiBzdGQ6OnR1cGxlPHN0ZDo6dWludDY0X3QsIENvc3Q+IExpbmU7Ly9Nb3ZlUG9zLGNvc3QKCnN0cnVjdCAgTm9kZXsKCXN0ZDo6dWludDY0X3QgViA9IDA7CglzdGQ6OnZlY3RvcjxMaW5lPiBSb2FkOwp9OwoKdHlwZWRlZiBzdGQ6OnZlY3RvcjwgTm9kZSA+IEdyYXBoOwpJbnB1dCBHZXRJbnB1dCgpIHsKCXN0ZDo6dWludDY0X3QgTiA9IDA7CglzdGQ6OnVpbnQ2NF90IFcgPSAwOwoKCU1vdW50YWluIE07CgoJc3RkOjpjaW4gPj4gTjsKCXN0ZDo6Y2luID4+IFc7CgoJc3RkOjp1aW50NjRfdCBUID0gMDsKCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJc3RkOjpjaW4gPj4gVDsKCQlNLnB1c2hfYmFjayhUKTsKCX0KCglzdGQ6OnVpbnQ2NF90IHUgPSAwOwoJc3RkOjp1aW50NjRfdCB2ID0gMDsKCXN0ZDo6dWludDY0X3QgYyA9IDA7CgoJUm9hZHMgUjsKCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJc3RkOjpjaW4gPj4gdT4+dj4+YzsKCQlSLnB1c2hfYmFjayh7dSx2LGN9KTsKCX0KCglyZXR1cm4geyBOLFcsTSxSIH07Cn0KCkdyYXBoIENvbnZlcnRlKGNvbnN0IElucHV0JiBJKSB7CglHcmFwaCBHKHN0ZDo6Z2V0PDA+KEkpKTsKCglhdXRvJiBtID0gc3RkOjpnZXQ8Mj4oSSk7CgoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHN0ZDo6Z2V0PDA+KEkpOyBpKyspIHsKCQlHW2ldLlYgPSBtW2ldOwoJfQoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHN0ZDo6Z2V0PDA+KEkpLTE7IGkrKykgewoJCUNvc3QgQyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp1aW50NjRfdD4oc3RkOjpnZXQ8Mj4oc3RkOjpnZXQ8Mz4oSSlbaV0pKTsKCQlHW3N0ZDo6Z2V0PDA+KHN0ZDo6Z2V0PDM+KEkpW2ldKSAtIDFdLlJvYWQucHVzaF9iYWNrKHtzdGQ6OmdldDwxPihzdGQ6OmdldDwzPihJKVtpXSkgLSAxLCBDIH0pOwoJCUdbc3RkOjpnZXQ8MT4oc3RkOjpnZXQ8Mz4oSSlbaV0pIC0gMV0uUm9hZC5wdXNoX2JhY2soe3N0ZDo6Z2V0PDA+KHN0ZDo6Z2V0PDM+KEkpW2ldKSAtIDEsIEMgfSk7Cgl9CgoJcmV0dXJuIEc7Cn0KCnN0ZDo6dWludDY0X3QgU29sdmVfcmVjKEdyYXBoIEcsIHN0ZDo6c2l6ZV90IElkeEEsc3RkOjpzaXplX3QgSWR4Qiwgc3RkOjpzaXplX3QgRGVwdGgsc3RkOjppbnQ2NF90IENvc3QsY29uc3Qgc3RkOjppbnQ2NF90JiBIYW5kLHN0ZDo6aW50NjRfdCYgTWF4KSB7CgoJaWYgKENvc3QgPCAwKSByZXR1cm4gMDsKCWlmIChIYW5kIDwgMCkgcmV0dXJuIDA7CglpZiAoRGVwdGggPiBHLnNpemUoKSoyKSByZXR1cm4gMDsKCWlmIChNYXggPCBDb3N0KSB7CgkJTWF4ID0gQ29zdDsKCX0KCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSBJZHhCOyBpIDwgR1tJZHhBXS5Sb2FkLnNpemUoKTsgaSsrKSB7CgkJc3RkOjppbnQ2NF90IE1DID0gKnN0ZDo6Z2V0PDE+KEdbSWR4QV0uUm9hZFtpXSk7CgkJaWYgKE1DID4gSGFuZCkgY29udGludWU7CgoJCSgqc3RkOjpnZXQ8MT4oR1tJZHhBXS5Sb2FkW2ldKSkgPSAwOwoJCXN0ZDo6aW50NjRfdCBNViA9IEdbSWR4QV0uVjsKCQlHW0lkeEFdLlYgPSAwOwoJCVNvbHZlX3JlYyhHLCBzdGQ6OmdldDwwPihHW0lkeEFdLlJvYWRbaV0pLCAwLCBEZXB0aCArIDEsIENvc3QgKyBNViwgSGFuZCAtIE1DLCBNYXgpOwoJCSgqc3RkOjpnZXQ8MT4oR1tJZHhBXS5Sb2FkW2ldKSkgPSBNQzsKCQlHW0lkeEFdLlYgPSBNVjsKCX0KCglyZXR1cm4gMDsKfQoKCnN0ZDo6dWludDY0X3QgU29sdmUoR3JhcGggRywgc3RkOjp1aW50NjRfdCBNb25leSkgewoJc3RkOjppbnQ2NF90IE1heCA9IDA7CgoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEcuc2l6ZSgpOyBpKyspIHsKCQlzdGQ6OmludDY0X3QgViA9IEdbaV0uVjsKCQlHW2ldLlYgPSAwOwoJCVNvbHZlX3JlYyhHLCBpLCAwLCAwLFYsTW9uZXksTWF4KTsKCQlHW2ldLlYgPSBWOwoJfQoKCXJldHVybiBNYXg7Cn0KCgppbnQgbWFpbigpIHsKCglJbnB1dCBJID0gR2V0SW5wdXQoKTsKCglHcmFwaCBHID0gQ29udmVydGUoSSk7CgoKCXN0ZDo6aW50NjRfdCBNYXggPSBTb2x2ZShHLCBzdGQ6OmdldDwxPihJKSk7CgoKCXN0ZDo6Y291dCA8PCBNYXggPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cgp9Cgo=