#include <bits/stdc++.h>
using namespace std;
struct node {
  int pos;
  double v;
  int dir;
};
node dat[100005];
int n;
double bs;
int one[1000005];
int two[1000005];
bool Judge(double t) {
  int sl, sr;
  sl = 1e6;
  sr = 0;
  memset(one, 0, sizeof(one));
  memset(two, 0, sizeof(two));
  for (int i = 0; i < n; i++) {
    int pos = dat[i].pos;
    int v = dat[i].v;
    if (dat[i].dir == 1) {
      if (v * t >= pos || (long long)v * (long long)t >= pos) {
        one[0]++;
        one[1000000 + 1]--;
        sl = 0;
        sr = 1e6;
        continue;
      }
      if ((v + bs) < pos / t) continue;
      double t1 = (pos - t * v) / bs;
      int r;
      if (bs > 1000000 / t)
        r = 1000000;
      else
        r = bs * t + t1 * v;
      r = min(1000000, r);
      if (sr < r) sr = r;
      if (sl > pos) sl = pos;
      one[pos]++;
      one[r + 1]--;
    } else {
      pos = 1e6 - pos;
      if (v * t >= pos || (long long)v * (long long)t >= pos) {
        two[0]++;
        two[1000000 + 1]--;
        sl = 0;
        sr = 1e6;
        continue;
      }
      if ((v + bs) < pos / t) continue;
      double t1 = (pos - t * v) / bs;
      int l;
      if (t > 1e6 / bs)
        l = 0;
      else
        l = 1e6 - floor(t * bs + t1 * v);
      l = max(0, l);
      if (sl > l) sl = l;
      if (sr < 1e6 - pos) sr = 1e6 - pos;
      two[l]++, two[1000000 - pos + 1]--;
    }
  }
  int cnt1 = 0;
  int cnt2 = 0;
  for (int i = sl; i <= sr; i++) {
    cnt1 += one[i];
    cnt2 += two[i];
    if (cnt1 > 0 && cnt2 > 0) return true;
  }
  return false;
}
double binAns(double s, double e) {
  double mid;
  for (int i = 0; i < 50; i++) {
    mid = (s + e) / 2;
    if (Judge(mid)) {
      e = mid;
    } else
      s = mid;
  }
  return mid;
}
int main() {
  while (scanf("%d%lf", &n, &bs) != EOF) {
    for (int i = 0; i < n; i++) {
      scanf("%d%lf%d", &dat[i].pos, &dat[i].v, &dat[i].dir);
    }
    double ans = binAns(0, 1e6);
    printf("%.10lf\n", ans);
  }
  return 0;
}
