#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 5;
const int BS_LIMIT = 50;
const double EPS = 1e-10;
double x[MAX], v[MAX], t[MAX], s;
int n;
inline bool good(double t_limit) {
  vector<tuple<double, int, int> > ranges;
  bool left_ok = false, right_ok = false;
  for (int i = int(1); i < int(n + 1); i++) {
    if (t[i] == 1) {
      double wasted_time = (double)x[i] / v[i];
      if (t_limit >= wasted_time) {
        left_ok = true;
        continue;
      }
      bool good = false;
      double left = 0.0, right = x[i];
      for (int j = int(0); j < int(BS_LIMIT); j++) {
        double mid = (left + right) / 2.0;
        double new_wasted = mid / (v[i] + s) + (x[i] - mid) / v[i];
        double k = s * ((x[i] - mid) / v[i]) + mid;
        if (t_limit >= new_wasted && 1e6 >= k && k >= 0.0) {
          right = mid;
          good = true;
        } else {
          left = mid;
        }
      }
      if (!good) {
        continue;
      }
      double k = (s * (x[i] - left) + v[i] * left) / v[i];
      ranges.emplace_back(ceil(x[i]), 0, 0);
      ranges.emplace_back(floor(k), 1, 0);
    } else {
      double wasted_time = (double)(1e6 - x[i]) / v[i];
      if (t_limit >= wasted_time) {
        right_ok = true;
        continue;
      }
      bool good = false;
      double left = x[i], right = 1e6;
      for (int j = int(0); j < int(BS_LIMIT); j++) {
        double mid = (left + right) / 2.0;
        double new_wasted = (1e6 - mid) / (v[i] + s) + (mid - x[i]) / v[i];
        double k = s * ((mid - x[i]) / v[i]) - mid;
        k *= -1;
        if (t_limit >= new_wasted && 1e6 >= k && k >= 0) {
          left = mid;
          good = true;
        } else {
          right = mid;
        }
      }
      if (!good) {
        continue;
      }
      double k = left - (s * (left - x[i])) / v[i];
      ranges.emplace_back(ceil(k), 0, 1);
      ranges.emplace_back(floor(x[i]), 1, 1);
    }
  }
  if (left_ok) {
    ranges.emplace_back(0.0, 0, 0);
    ranges.emplace_back(1e6, 1, 0);
  }
  if (right_ok) {
    ranges.emplace_back(0.0, 0, 1);
    ranges.emplace_back(1e6, 1, 1);
  }
  int lo = 0, ro = 0;
  sort(ranges.begin(), ranges.end());
  bool ok = false;
  for (auto &each : ranges) {
    double val;
    int type, dir;
    tie(val, type, dir) = each;
    if (type == 0) {
      lo += dir == 0;
      ro += dir == 1;
    } else {
      lo -= dir == 0;
      ro -= dir == 1;
    }
    if (lo && ro) {
      ok = true;
    }
  }
  return ok;
}
int main() {
  scanf("%d %lf", &n, &s);
  for (int i = int(1); i < int(n + 1); i++) {
    scanf("%lf %lf %lf", x + i, v + i, t + i);
  }
  double left = 0.0, right = 1e6;
  for (int i = int(0); i < int(BS_LIMIT); i++) {
    double mid = (left + right) / 2.0;
    if (good(mid)) {
      right = mid;
    } else {
      left = mid;
    }
  }
  printf("%.15lf\n", left);
  return 0;
}
