#include <bits/stdc++.h>   using namespace std;   template <typename A, typename B>   inline char smax(A &a, const B &b) {     return a < b ? a = b, 1 : 0;   }   template <typename A, typename B>   inline char smin(A &a, const B &b) {     return b < a ? a = b, 1 : 0;   }   template <typename I>   inline void read(I &x) {     int f = 0, c;     while (!isdigit(c = getchar())) c ==  -  ? f = 1 : 0;     x = c & 15;     while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);     f ? x = -x : 0;   }   const int N = 1e5 + 7;   const int LOG = 36;   const double eps = 1e-13;   int n, nl;   long long t;   double M;   int a[N], b[N], q[N];   double p[N];   inline int dcmp(const double &x) {     return fabs(x) < eps ? 0 : (x < 0 ? -1 : 1);   }   struct Line {     double k, b;     inline bool operator<(const Line &a) const {       return dcmp(k - a.k) < 0 || (dcmp(k - a.k) == 0 && b < a.b);     }   } l[N];   inline double crs(const Line &l1, const Line &l2) {     return (l2.b - l1.b) / (l1.k - l2.k);   }   struct Matrix {     double a[3][3];     inline Matrix() { memset(a, 0, sizeof(a)); }     inline Matrix(const double &x) {       memset(a, 0, sizeof(a));       a[0][0] = a[1][1] = a[2][2] = x;     }     inline void print() {       for (int i = 0; i < 3; ++i) {         for (int j = 0; j < 3; ++j) fprintf(stderr,  %.13lf  , a[i][j]);         puts(  );       }     }     inline Matrix operator*(const Matrix &b) {       Matrix c;       c.a[0][0] = a[0][0] * b.a[0][0] + a[0][1] * b.a[1][0] + a[0][2] * b.a[2][0];       c.a[0][1] = a[0][0] * b.a[0][1] + a[0][1] * b.a[1][1] + a[0][2] * b.a[2][1];       c.a[0][2] = a[0][0] * b.a[0][2] + a[0][1] * b.a[1][2] + a[0][2] * b.a[2][2];       c.a[1][0] = a[1][0] * b.a[0][0] + a[1][1] * b.a[1][0] + a[1][2] * b.a[2][0];       c.a[1][1] = a[1][0] * b.a[0][1] + a[1][1] * b.a[1][1] + a[1][2] * b.a[2][1];       c.a[1][2] = a[1][0] * b.a[0][2] + a[1][1] * b.a[1][2] + a[1][2] * b.a[2][2];       c.a[2][0] = a[2][0] * b.a[0][0] + a[2][1] * b.a[1][0] + a[2][2] * b.a[2][0];       c.a[2][1] = a[2][0] * b.a[0][1] + a[2][1] * b.a[1][1] + a[2][2] * b.a[2][1];       c.a[2][2] = a[2][0] * b.a[0][2] + a[2][1] * b.a[1][2] + a[2][2] * b.a[2][2];       return c;     }   } f[LOG];   inline void ycl() {     for (int i = 1; i <= n; ++i)       smax(M, p[i] * b[i]), l[i] = (Line){p[i], p[i] * a[i]};     sort(l + 1, l + n + 1);     for (int i = 1; i <= n; ++i)       if (dcmp(l[i].k - l[nl].k))         l[++nl] = l[i];       else         l[nl] = l[i];     n = nl, nl = 1;     q[1] = 1;     for (int i = 2; i <= n; ++i) {       while (nl > 1 &&              dcmp(crs(l[q[nl - 1]], l[i]) - crs(l[q[nl - 1]], l[q[nl]])) <= 0)         --nl;       q[++nl] = i;     }     for (int i = 1; i <= nl; ++i) l[i] = l[q[i]];     n = nl;   }   inline void work() {     ycl();     double dp = 0;     long long tt = 0;     for (int i = 1; i <= n && tt < t; ++i) {       double stp;       if (i < n)         stp = crs(l[i], l[i + 1]);       else         stp = 1e20;       if (tt < t && dcmp(tt * M - dp - stp) >= 0) continue;       Matrix A, B;       A.a[0][0] = dp, A.a[1][0] = tt, A.a[2][0] = 1;       B.a[0][0] = 1 - l[i].k, B.a[0][1] = l[i].k * M, B.a[0][2] = l[i].b;       B.a[1][1] = 1, B.a[1][2] = 1;       B.a[2][2] = 1;       f[0] = B;       for (int i = 1; i < LOG; ++i) f[i] = f[i - 1] * f[i - 1];       for (int i = LOG - 1; ~i; --i)         if (tt + (1ll << i) < t) {           Matrix C = f[i] * A;           if (dcmp(C.a[1][0] * M - C.a[0][0] - stp) < 0) A = C, tt += 1ll << i;         }       A = f[0] * A, ++tt;       dp = A.a[0][0];     }     printf( %.13lf n , dp);   }   inline void init() {     read(n), read(t);     for (int i = 1; i <= n; ++i) read(a[i]), read(b[i]), scanf( %lf , &p[i]);   }   int main() {     init();     work();     fclose(stdin), fclose(stdout);     return 0;   }