#include <bits/stdc++.h>
using namespace std;
const int LEFT = 1;
const int RIGHT = 2;
const int END = 1000 * 1000;
struct People {
  int pos, speed, direction;
};
struct Segment {
  int left, right;
};
struct Flag {
  int pos, isBegin, direction;
  bool operator<(const Flag &rhs) const {
    return pos < rhs.pos || (pos == rhs.pos && isBegin > rhs.isBegin);
  }
};
bool intersect(vector<Segment> &ld, vector<Segment> &rd) {
  vector<Flag> flags;
  flags.reserve((ld.size() + rd.size()) * 2);
  for (int i = 0; i < ld.size(); i++) {
    flags.push_back({ld[i].left, 1, LEFT});
    flags.push_back({ld[i].right, 0, LEFT});
  }
  for (int i = 0; i < rd.size(); i++) {
    flags.push_back({rd[i].left, 1, RIGHT});
    flags.push_back({rd[i].right, 0, RIGHT});
  }
  sort(flags.begin(), flags.end());
  int cnt[3] = {
      0,
  };
  for (int i = 0; i < flags.size(); i++) {
    if (flags[i].isBegin) {
      cnt[flags[i].direction]++;
    } else {
      cnt[flags[i].direction]--;
    }
    if (cnt[LEFT] > 0 && cnt[RIGHT] > 0) return true;
  }
  return false;
}
bool decision(vector<People> &peoples, int n, int s, double t) {
  vector<Segment> segments[3];
  for (int i = 0; i < n; i++) {
    const auto &p = peoples[i];
    double distance = (p.direction == LEFT ? p.pos : END - p.pos);
    double temp = distance / (double)p.speed;
    if (temp <= t) {
      segments[p.direction].push_back({0, END});
      continue;
    }
    double vsum = s + p.speed;
    double rhs = (t - distance / vsum) / (1 - p.speed / vsum);
    if (rhs < 0.0) continue;
    int left =
        (p.direction == LEFT ? p.pos
                             : ceil(max(0.0, p.pos - rhs * (s - p.speed))));
    int right =
        (p.direction == RIGHT ? p.pos
                              : min<double>(END, p.pos + rhs * (s - p.speed)));
    segments[p.direction].push_back({left, right});
  }
  return intersect(segments[LEFT], segments[RIGHT]);
}
double bisearch(vector<People> &peoples, int n, int s) {
  double lo = 0.0, hi = END;
  for (int i = 0; i < 100; i++) {
    double mid = (lo + hi) / 2;
    if (decision(peoples, n, s, mid))
      hi = mid;
    else
      lo = mid;
  }
  return (hi + lo) / 2;
}
int main() {
  std::ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, s;
  cin >> n >> s;
  vector<People> peoples(n);
  for (int i = 0; i < n; i++) {
    int pos, speed, direction;
    cin >> pos >> speed >> direction;
    peoples[i] = {pos, speed, direction};
  }
  cout << fixed << setprecision(30) << bisearch(peoples, n, s) << '\n';
  return 0;
}
