#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
const int _ = 100007;
const double eps = 1e-10;
inline int dcmp(double x) {
  if (-eps < x && x < eps) return 0;
  return x > 0 ? 1 : -1;
}
struct lines {
  double k, b;
  lines(double k_ = 0, double b_ = 0) { k = k_, b = b_; }
  double f(double x) { return k * x + b; }
  friend bool operator<(lines a, lines b) {
    if (dcmp(a.k - b.k) == 0) return a.b < b.b;
    return a.k > b.k;
  }
} ps[_];
double llcrash(lines a, lines b) { return (a.b - b.b) / (b.k - a.k); }
double fuck(double nowf, double mx, lines dlt, long long tim) {
  double los = 1 + dlt.k, per = dlt.b + mx, slos = pow(los, tim);
  return nowf * slos + per * (1 - slos) / (1 - los);
}
int n;
long long tim;
lines stk[_];
double loc[_];
int top = 0;
int main() {
  ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
  cin >> n >> tim;
  double mx = 0;
  for (int i = 1; i <= n; i++) {
    int a, b;
    double p;
    cin >> a >> b >> p, mx = max(mx, b * p), ps[i] = lines(-p, -a * p);
  }
  sort(ps + 1, ps + n + 1);
  top = 0;
  for (int i = 1; i <= n; i++) {
    if (dcmp(ps[i].k - ps[i - 1].k) == 0) continue;
    while (top > 0 && ps[i].f(loc[top]) < stk[top].f(loc[top])) top--;
    stk[++top] = ps[i], loc[top] = llcrash(stk[top], stk[top - 1]);
  }
  loc[top + 1] = 1e99;
  long long now = 0;
  double nowf = 0;
  for (int i = 1; i <= top; i++) {
    long long l = 0, r = tim - now;
    while (r > l) {
      long long mid = (l + r) >> 1;
      if (fuck(nowf, mx, stk[i], mid) > loc[i + 1])
        r = mid;
      else
        l = mid + 1;
    }
    now += r, nowf = fuck(nowf, mx, stk[i], r);
    if (now >= tim) break;
  }
  cout << setprecision(11) << fixed << mx * now - nowf << lf;
  return 0;
}
