#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; ++i)
#define fi first
#define se second
#define el "\n"
#define pb push_back
#define sz(a) (int)(a).size()
#define FILL(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const int N = 1000003;
struct P{ long double x,y; };
static inline long double cross(const P& a, const P& b, const P& c){
return (b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n; long double M;
if(!(cin>>n>>M)) return 0;
vector<P> v; v.reserve(n);
FOR(i,1,n){
long double w,a,b; cin>>w>>a>>b;
long double x=a/w, y=b/w;
if(x>0 || y>0) v.pb({x,y});
}
if(M==0 || v.empty()){
cout.setf(std::ios::fixed); cout<<setprecision(2)<<0.0<<el;
return 0;
}
sort(v.begin(), v.end(), [](const P& A, const P& B){
if(A.x==B.x) return A.y>B.y;
return A.x<B.x;
});
vector<P> u; u.reserve(sz(v));
for(int i=0;i<sz(v);++i){
if(u.empty() || v[i].x!=u.back().x) u.pb(v[i]);
else if(v[i].y>u.back().y) u.back().y=v[i].y;
}
vector<P> s; s.reserve(sz(u));
for(int i=0;i<sz(u);++i){
while(!s.empty() && s.back().y<=u[i].y) s.pop_back();
s.pb(u[i]);
}
vector<P> h; h.reserve(sz(s));
for(int i=0;i<sz(s);++i){
while(sz(h)>=2 && cross(h[sz(h)-2],h[sz(h)-1],s[i])>=0) h.pop_back();
h.pb(s[i]);
}
long double best=0;
for(int i=0;i<sz(h);++i) if(h[i].x*h[i].y>best) best=h[i].x*h[i].y;
for(int i=0;i+1<sz(h);++i){
long double x1=h[i].x,y1=h[i].y,x2=h[i+1].x,y2=h[i+1].y;
long double dx=x2-x1, dy=y2-y1;
if(dx==0 || dy==0) continue;
long double t=-(x1*dy+y1*dx)/(2*dx*dy);
if(t>0 && t<1){
long double X=x1+t*dx, Y=y1+t*dy;
long double val=X*Y;
if(val>best) best=val;
}
}
long double ans = M*M*best;
cout.setf(std::ios::fixed);
cout<<setprecision(2)<<(double)ans<<el;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGk9KGEpLF9iPShiKTsgaTw9X2I7ICsraSkKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGVsICJcbiIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBzeihhKSAoaW50KShhKS5zaXplKCkKI2RlZmluZSBGSUxMKGEseCkgbWVtc2V0KGEseCxzaXplb2YoYSkpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LGludD4gaWk7CmNvbnN0IGludCBOID0gMTAwMDAwMzsKCnN0cnVjdCBQeyBsb25nIGRvdWJsZSB4LHk7IH07CgpzdGF0aWMgaW5saW5lIGxvbmcgZG91YmxlIGNyb3NzKGNvbnN0IFAmIGEsIGNvbnN0IFAmIGIsIGNvbnN0IFAmIGMpewpyZXR1cm4gKGIueC1hLngpKihjLnktYi55KS0oYi55LWEueSkqKGMueC1iLngpOwp9CgppbnQgbWFpbigpewppb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CmNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwoKaW50IG47IGxvbmcgZG91YmxlIE07CmlmKCEoY2luPj5uPj5NKSkgcmV0dXJuIDA7CnZlY3RvcjxQPiB2OyB2LnJlc2VydmUobik7CkZPUihpLDEsbil7CmxvbmcgZG91YmxlIHcsYSxiOyBjaW4+Pnc+PmE+PmI7CmxvbmcgZG91YmxlIHg9YS93LCB5PWIvdzsKaWYoeD4wIHx8IHk+MCkgdi5wYih7eCx5fSk7Cn0KaWYoTT09MCB8fCB2LmVtcHR5KCkpewpjb3V0LnNldGYoc3RkOjppb3M6OmZpeGVkKTsgY291dDw8c2V0cHJlY2lzaW9uKDIpPDwwLjA8PGVsOwpyZXR1cm4gMDsKfQpzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgW10oY29uc3QgUCYgQSwgY29uc3QgUCYgQil7CmlmKEEueD09Qi54KSByZXR1cm4gQS55PkIueTsKcmV0dXJuIEEueDxCLng7Cn0pOwp2ZWN0b3I8UD4gdTsgdS5yZXNlcnZlKHN6KHYpKTsKZm9yKGludCBpPTA7aTxzeih2KTsrK2kpewppZih1LmVtcHR5KCkgfHwgdltpXS54IT11LmJhY2soKS54KSB1LnBiKHZbaV0pOwplbHNlIGlmKHZbaV0ueT51LmJhY2soKS55KSB1LmJhY2soKS55PXZbaV0ueTsKfQp2ZWN0b3I8UD4gczsgcy5yZXNlcnZlKHN6KHUpKTsKZm9yKGludCBpPTA7aTxzeih1KTsrK2kpewp3aGlsZSghcy5lbXB0eSgpICYmIHMuYmFjaygpLnk8PXVbaV0ueSkgcy5wb3BfYmFjaygpOwpzLnBiKHVbaV0pOwp9CnZlY3RvcjxQPiBoOyBoLnJlc2VydmUoc3oocykpOwpmb3IoaW50IGk9MDtpPHN6KHMpOysraSl7CndoaWxlKHN6KGgpPj0yICYmIGNyb3NzKGhbc3ooaCktMl0saFtzeihoKS0xXSxzW2ldKT49MCkgaC5wb3BfYmFjaygpOwpoLnBiKHNbaV0pOwp9CmxvbmcgZG91YmxlIGJlc3Q9MDsKZm9yKGludCBpPTA7aTxzeihoKTsrK2kpIGlmKGhbaV0ueCpoW2ldLnk+YmVzdCkgYmVzdD1oW2ldLngqaFtpXS55Owpmb3IoaW50IGk9MDtpKzE8c3ooaCk7KytpKXsKbG9uZyBkb3VibGUgeDE9aFtpXS54LHkxPWhbaV0ueSx4Mj1oW2krMV0ueCx5Mj1oW2krMV0ueTsKbG9uZyBkb3VibGUgZHg9eDIteDEsIGR5PXkyLXkxOwppZihkeD09MCB8fCBkeT09MCkgY29udGludWU7CmxvbmcgZG91YmxlIHQ9LSh4MSpkeSt5MSpkeCkvKDIqZHgqZHkpOwppZih0PjAgJiYgdDwxKXsKbG9uZyBkb3VibGUgWD14MSt0KmR4LCBZPXkxK3QqZHk7CmxvbmcgZG91YmxlIHZhbD1YKlk7CmlmKHZhbD5iZXN0KSBiZXN0PXZhbDsKfQp9CmxvbmcgZG91YmxlIGFucyA9IE0qTSpiZXN0Owpjb3V0LnNldGYoc3RkOjppb3M6OmZpeGVkKTsKY291dDw8c2V0cHJlY2lzaW9uKDIpPDwoZG91YmxlKWFuczw8ZWw7CnJldHVybiAwOwp9Cg==