#include <bits/stdc++.h>
using namespace std;
template <typename Iter>
ostream& _out(ostream& s, Iter a, Iter b) {
  for (auto it = a; it != b; it++) s << (it == a ? "" : " ") << *it;
  return s;
}
template <typename A, typename B>
ostream& operator<<(ostream& s, pair<A, B>& p) {
  return s << "(" << p.first << " , " << p.second << ")";
}
template <typename T>
ostream& operator<<(ostream& s, vector<T>& v) {
  return _out(s, v.begin(), v.end());
}
inline long long rit() {
  int key = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') key = -1;
    c = getchar();
  }
  long long x = 0;
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * key;
}
int __ = 1;
void init() {}
void read() {}
void solve() {}
int x[1000010], v[1000010];
int d[1000010];
int n;
double s;
int tag_one[1000010], tag_two[1000010];
bool judge(double t) {
  memset(tag_one, 0, sizeof(tag_one));
  memset(tag_two, 0, sizeof(tag_two));
  int ok1 = 0, ok2 = 0;
  for (int i = 1; i <= n; i++) {
    if (d[i] == 1) {
      int l = x[i], r = 1000001;
      while (l < r) {
        int mid = l + (r - l) / 2;
        double run;
        if (s - v[i] != 0 && (double)(mid - x[i]) / (double)(s - v[i]) <= t)
          run = (double)v[i] * (mid - x[i]) / (double)(s - v[i]) +
                (t - (double)(mid - x[i]) / (double)(s - v[i])) * (s + v[i]);
        else
          run = t * v[i];
        if (run >= (double)x[i])
          l = mid + 1;
        else
          r = mid;
      }
      if (t * v[i] >= (double)x[i]) {
        ok1 = 1;
        continue;
      }
      tag_one[x[i]]++, tag_one[l]--;
    } else {
      int l = 0, r = x[i] + 1;
      while (l < r) {
        int mid = l + (r - l) / 2;
        double run;
        if (s - v[i] != 0 && (double)(x[i] - mid) / (double)(s - v[i]) <= t)
          run = (double)v[i] * (x[i] - mid) / (s - v[i]) +
                (t - (double)(x[i] - mid) / (double)(s - v[i])) * (s + v[i]);
        else
          run = t * v[i];
        if (run >= (double)1e6 - x[i])
          r = mid;
        else
          l = mid + 1;
      }
      if (t * v[i] >= 1e6 - x[i]) {
        ok2 = 1;
        continue;
      }
      tag_two[r]++, tag_two[x[i] + 1]--;
    }
  }
  for (int i = 0; i <= 1000000; i++) {
    ok1 += tag_one[i];
    ok2 += tag_two[i];
    if (ok1 && ok2) return true;
  }
  return false;
}
int main() {
  cin >> n >> s;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &x[i], &v[i], &d[i]);
  }
  double l = 0, r = 1e7;
  for (int i = 0; i < 200; i++) {
    double mid = (l + r) / 2;
    if (judge(mid))
      r = mid;
    else
      l = mid;
    if (r - l < 1e-9) break;
  }
  printf("%.8lf\n", l);
  return 0;
}
