#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 200010
struct DayNode
{
double A,B,Ra,k; int id;
bool operator < (const DayNode & T) const
{return k<T.k;}
}a[maxn];
struct PointNode{double x,y;}p[maxn];
int N;
double dp[maxn];
int tmp[maxn],stack[maxn],top;
#define inf 1e9
#define eps 1e-9
double slope(int l1,int l2)
{
if (l1==0) return -inf;
if (l2==0) return inf;
if (fabs(p[l1].x-p[l2].x)<=eps) return -inf;
return (p[l1].y-p[l2].y)/(p[l1].x-p[l2].x);
}
void CDQ(int l,int r)
{
if (l==r)
{
dp[l]=max(dp[l],dp[l-1]);
p[l].y=dp[l]/(a[l].Ra*a[l].A+a[l].B);
p[l].x=a[l].Ra*p[l].y;
return;
}
int mid=(l+r)>>1,L,R;
L=l; R=mid+1;
for (int i=l; i<=r; i++)
if (a[i].id<=mid) tmp[L++]=i; else tmp[R++]=i;
for (int i=l; i<=r; i++) p[i]=p[tmp[i]];
CDQ(l,mid);
top=0;
for (int i=l; i<=mid; i++)
{
while (top>1 && slope(stack[top],stack[top-1])<slope(i,stack[top-1])+eps) top--;
stack[++top]=i;
}
int Top=1;
for (int i=r; i>=mid+1; i--)
{
while (Top<top && slope(stack[Top],stack[Top+1])+eps>a[i].k) Top++;
dp[a[i].id]=max(dp[a[i].id],p[stack[Top]].x*a[i].A+p[stack[Top]].y*a[i].B);
}
CDQ(mid+1,r);
L=l,R=mid+1;
for (int i=l; i<=r; i++)
if(((p[L].x<p[R].x+eps || (fabs(p[L].x-p[R].x)<=eps && p[L].y<p[R].y+eps)) || R>r) && L<=mid)
tmp[i]=L++;
else tmp[i]=R++;
for (int i=l; i<=r; i++) p[i]=p[tmp[i]];
}
int main()
{
scanf("%d%lf",&N,&dp[0]);
for (int i=1; i<=N; i++)
scanf("%lf%lf%lf",&a[i].A,&a[i].B,&a[i].Ra),a[i].k=-a[i].A/a[i].B,a[i].id=i;
sort(a+1,a+N+1);
CDQ(1,N);
//for (int i=1; i<=N; i++) printf("%d %d %.3lf %.3lf %.3lf %.3lf \n",i,a[i].id,a[i].A,a[i].B,a[i].Ra,a[i].k);
printf("%.3lf\n",dp[N]);
return 0;
}