#include <bits/stdc++.h>
using namespace std;
vector<vector<double>> IDENT() {
  vector<vector<double>> A(3, vector<double>(3));
  for (int i = 0; i < 3; i++) A[i][i] = 1;
  return A;
}
vector<vector<double>> mul(vector<vector<double>> A, vector<vector<double>> B) {
  vector<vector<double>> C(A.size(), vector<double>(B[0].size()));
  for (size_t i = 0; i < C.size(); i++) {
    for (size_t j = 0; j < C[i].size(); j++) {
      for (size_t k = 0; k < A[0].size(); k++) {
        C[i][j] += A[i][k] * B[k][j];
      }
    }
  }
  return C;
}
vector<vector<double>> exp(vector<vector<double>> A, long long k) {
  vector<vector<double>> res = IDENT();
  while (k) {
    if (k % 2 == 1) {
      res = mul(res, A);
    }
    A = mul(A, A);
    k /= 2;
  }
  return res;
}
const int MX = 100005;
const double EPS = 1e-20;
struct Line {
  double k, b;
  double a, p;
  double L, R;
} lines[MX];
bool operator<(Line a, Line b) {
  if (abs(a.k - b.k) < EPS) {
    return a.b > b.b;
  }
  return a.k < b.k;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n;
  long long T;
  cin >> n >> T;
  double M = 0;
  for (int i = 0; i < n; i++) {
    double a, b, p;
    cin >> a >> b >> p;
    M = max(M, b * p);
    lines[i].k = p;
    lines[i].b = p * a;
    lines[i].a = a;
    lines[i].p = p;
  }
  sort(lines, lines + n);
  int sz = 0;
  for (int i = 0; i < n; i++) {
    if (i == 0) {
      lines[i].L = -2000000000000000000000.0;
      lines[i].R = 20000000000000000000000.0;
      sz++;
      continue;
    }
    if (abs(lines[i].k - lines[sz - 1].k) < EPS) continue;
    double X;
    while (true) {
      X = (lines[i].b - lines[sz - 1].b) / (lines[sz - 1].k - lines[i].k);
      if (X <= lines[sz - 1].L)
        sz--;
      else
        break;
    }
    lines[sz - 1].R = X;
    lines[sz] = lines[i];
    lines[sz].L = X;
    lines[sz].R = 2000000000000000000.0;
    sz++;
  }
  for (int i = 0; i < sz; i++) {
  }
  vector<vector<double>> cur_state(3, vector<double>(1));
  cur_state[2][0] = 1;
  long long t = 0;
  for (int i = 0; i < sz; i++) {
    if (cur_state[1][0] * M - cur_state[0][0] >= lines[i].R || t >= T) continue;
    vector<vector<double>> X[45];
    X[0] = {{1 - lines[i].p, lines[i].p * M, lines[i].p * lines[i].a},
            {0, 1, 1},
            {0, 0, 1}};
    for (int j = 0; j < 44; j++) {
      X[j + 1] = mul(X[j], X[j]);
    }
    for (long long j = 44; j >= 0; j--) {
      if (t + (1LL << j) >= T) continue;
      vector<vector<double>> new_state = mul(X[j], cur_state);
      if (new_state[1][0] * M - new_state[0][0] < lines[i].R) {
        cur_state = new_state;
        t += (1LL << j);
      }
    }
    cur_state = mul(X[0], cur_state);
    t++;
  }
  cout << setprecision(15) << fixed << cur_state[0][0];
}
