// ~~ 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==