// ~~ icebear ~~
// MOB — Pareto + quadratic closed form
#include <bits/stdc++.h>
using namespace std;
using ld = long double;
struct Item {
ld w, a, b;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
ld M;
cin >> n >> M;
vector<Item> v(n);
for (int i = 0; i < n; ++i)
cin >> v[i].w >> v[i].a >> v[i].b;
// ---- Pareto pruning ----
vector<pair<ld, ld>> pts;
for (auto &x : v)
pts.push_back({x.a / x.w, x.b / x.w});
vector<int> idx(n);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int i, int j) {
auto [ri, si] = pts[i];
auto [rj, sj] = pts[j];
if (ri != rj) return ri > rj; // sort by r descending
return si < sj; // tie-break by s ascending
});
vector<Item> keep;
ld bestS = -1e100;
for (int id : idx) {
ld s = pts[id].second;
if (s > bestS) {
bestS = s;
keep.push_back(v[id]);
}
}
int k = keep.size();
// ---- Evaluate ----
ld ans = 0;
auto fval = [&](ld ai, ld aj, ld bi, ld bj, ld wi, ld wj, ld x) {
if (x < 0) return (ld)-1e100;
ld y = (M - wi * x) / wj;
if (y < 0) return (ld)-1e100;
ld A = ai * x + aj * y;
ld B = bi * x + bj * y;
return A * B;
};
for (int i = 0; i < k; ++i) {
ld wi = keep[i].w, ai = keep[i].a, bi = keep[i].b;
ld z = M / wi;
ans = max(ans, (ai * z) * (bi * z));
for (int j = i + 1; j < k; ++j) {
ld wj = keep[j].w, aj = keep[j].a, bj = keep[j].b;
ld p = ai - aj * wi / wj;
ld q = aj * M / wj;
ld r = bi - bj * wi / wj;
ld s = bj * M / wj;
ld best = max(fval(ai, aj, bi, bj, wi, wj, 0),
fval(ai, aj, bi, bj, wi, wj, M / wi));
if (p * r < 0) {
ld xstar = -(p * s + q * r) / (2 * p * r);
if (xstar >= 0 && xstar <= M / wi)
best = max(best, fval(ai, aj, bi, bj, wi, wj, xstar));
}
ans = max(ans, best);
}
}
cout << fixed << setprecision(2) << (double)ans << "\n";
}
Ly8gfn4gaWNlYmVhciB+fgovLyBNT0Ig4oCUIFBhcmV0byArIHF1YWRyYXRpYyBjbG9zZWQgZm9ybQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbGQgPSBsb25nIGRvdWJsZTsKCnN0cnVjdCBJdGVtIHsKICAgIGxkIHcsIGEsIGI7Cn07CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBpbnQgbjsKICAgIGxkIE07CiAgICBjaW4gPj4gbiA+PiBNOwogICAgdmVjdG9yPEl0ZW0+IHYobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICBjaW4gPj4gdltpXS53ID4+IHZbaV0uYSA+PiB2W2ldLmI7CgogICAgLy8gLS0tLSBQYXJldG8gcHJ1bmluZyAtLS0tCiAgICB2ZWN0b3I8cGFpcjxsZCwgbGQ+PiBwdHM7CiAgICBmb3IgKGF1dG8gJnggOiB2KQogICAgICAgIHB0cy5wdXNoX2JhY2soe3guYSAvIHgudywgeC5iIC8geC53fSk7CiAgICB2ZWN0b3I8aW50PiBpZHgobik7CiAgICBpb3RhKGlkeC5iZWdpbigpLCBpZHguZW5kKCksIDApOwoKICAgIHNvcnQoaWR4LmJlZ2luKCksIGlkeC5lbmQoKSwgWyZdKGludCBpLCBpbnQgaikgewogICAgICAgIGF1dG8gW3JpLCBzaV0gPSBwdHNbaV07CiAgICAgICAgYXV0byBbcmosIHNqXSA9IHB0c1tqXTsKICAgICAgICBpZiAocmkgIT0gcmopIHJldHVybiByaSA+IHJqOyAvLyBzb3J0IGJ5IHIgZGVzY2VuZGluZwogICAgICAgIHJldHVybiBzaSA8IHNqOyAgICAgICAgICAgICAgIC8vIHRpZS1icmVhayBieSBzIGFzY2VuZGluZwogICAgfSk7CgogICAgdmVjdG9yPEl0ZW0+IGtlZXA7CiAgICBsZCBiZXN0UyA9IC0xZTEwMDsKICAgIGZvciAoaW50IGlkIDogaWR4KSB7CiAgICAgICAgbGQgcyA9IHB0c1tpZF0uc2Vjb25kOwogICAgICAgIGlmIChzID4gYmVzdFMpIHsKICAgICAgICAgICAgYmVzdFMgPSBzOwogICAgICAgICAgICBrZWVwLnB1c2hfYmFjayh2W2lkXSk7CiAgICAgICAgfQogICAgfQogICAgaW50IGsgPSBrZWVwLnNpemUoKTsKCiAgICAvLyAtLS0tIEV2YWx1YXRlIC0tLS0KICAgIGxkIGFucyA9IDA7CiAgICBhdXRvIGZ2YWwgPSBbJl0obGQgYWksIGxkIGFqLCBsZCBiaSwgbGQgYmosIGxkIHdpLCBsZCB3aiwgbGQgeCkgewogICAgICAgIGlmICh4IDwgMCkgcmV0dXJuIChsZCktMWUxMDA7CiAgICAgICAgbGQgeSA9IChNIC0gd2kgKiB4KSAvIHdqOwogICAgICAgIGlmICh5IDwgMCkgcmV0dXJuIChsZCktMWUxMDA7CiAgICAgICAgbGQgQSA9IGFpICogeCArIGFqICogeTsKICAgICAgICBsZCBCID0gYmkgKiB4ICsgYmogKiB5OwogICAgICAgIHJldHVybiBBICogQjsKICAgIH07CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgICAgICBsZCB3aSA9IGtlZXBbaV0udywgYWkgPSBrZWVwW2ldLmEsIGJpID0ga2VlcFtpXS5iOwogICAgICAgIGxkIHogPSBNIC8gd2k7CiAgICAgICAgYW5zID0gbWF4KGFucywgKGFpICogeikgKiAoYmkgKiB6KSk7CiAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgazsgKytqKSB7CiAgICAgICAgICAgIGxkIHdqID0ga2VlcFtqXS53LCBhaiA9IGtlZXBbal0uYSwgYmogPSBrZWVwW2pdLmI7CiAgICAgICAgICAgIGxkIHAgPSBhaSAtIGFqICogd2kgLyB3ajsKICAgICAgICAgICAgbGQgcSA9IGFqICogTSAvIHdqOwogICAgICAgICAgICBsZCByID0gYmkgLSBiaiAqIHdpIC8gd2o7CiAgICAgICAgICAgIGxkIHMgPSBiaiAqIE0gLyB3ajsKICAgICAgICAgICAgbGQgYmVzdCA9IG1heChmdmFsKGFpLCBhaiwgYmksIGJqLCB3aSwgd2osIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZ2YWwoYWksIGFqLCBiaSwgYmosIHdpLCB3aiwgTSAvIHdpKSk7CiAgICAgICAgICAgIGlmIChwICogciA8IDApIHsKICAgICAgICAgICAgICAgIGxkIHhzdGFyID0gLShwICogcyArIHEgKiByKSAvICgyICogcCAqIHIpOwogICAgICAgICAgICAgICAgaWYgKHhzdGFyID49IDAgJiYgeHN0YXIgPD0gTSAvIHdpKQogICAgICAgICAgICAgICAgICAgIGJlc3QgPSBtYXgoYmVzdCwgZnZhbChhaSwgYWosIGJpLCBiaiwgd2ksIHdqLCB4c3RhcikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFucyA9IG1heChhbnMsIGJlc3QpOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbigyKSA8PCAoZG91YmxlKWFucyA8PCAiXG4iOwp9Cg==