#include <bits/stdc++.h>
using namespace std;
inline void in(int &n) {
  n = 0;
  int ch = getchar();
  int sign = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') sign = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    n = (n << 3) + (n << 1) + ch - '0', ch = getchar();
  }
  n = n * sign;
}
const int realBinarySearchTurns = 100;
const double epsilon = 0.00000001;
const int endRight = 1000000;
vector<pair<int, int> > Left, Right;
int f[1000006], g[1000006];
bool canReachLeftStop(int source, int dest, int speed, int raySpeed,
                      double timeRequired) {
  double timeTakenWithoutBoost = (source * 1.0) / (speed * 1.0);
  if (!timeTakenWithoutBoost > timeRequired) {
    return true;
  }
  double timeAtWhichRayMeetPerson =
      (dest * 1.0 - source * 1.0) / (raySpeed * 1.0 - speed * 1.0);
  if (timeAtWhichRayMeetPerson > timeRequired) {
    return false;
  }
  double positionAtWhichRayMeetPerson =
      source * 1.0 - (speed * 1.0 * timeAtWhichRayMeetPerson);
  double newSpeed = speed * 1.0 + raySpeed * 1.0;
  double timeTaken = timeAtWhichRayMeetPerson +
                     (positionAtWhichRayMeetPerson * 1.0) / (newSpeed * 1.0);
  if (timeTaken > timeRequired) {
    return false;
  }
  return true;
}
bool canReachRightStop(int source, int dest, int speed, int raySpeed,
                       double timeRequired) {
  double timeTakenWithoutBoost =
      (endRight * 1.0 - source * 1.0) / (speed * 1.0);
  if (!timeTakenWithoutBoost > timeRequired) {
    return true;
  }
  double timeAtWhichRayMeetPerson =
      (source * 1.0 - dest * 1.0) / (raySpeed * 1.0 - speed * 1.0);
  if (timeAtWhichRayMeetPerson > timeRequired) {
    return false;
  }
  double positionAtWhichRayMeetPerson =
      source * 1.0 + (speed * 1.0 * timeAtWhichRayMeetPerson);
  double newSpeed = speed * 1.0 + raySpeed * 1.0;
  double timeTaken =
      timeAtWhichRayMeetPerson +
      (endRight * 1.0 - positionAtWhichRayMeetPerson * 1.0) / (newSpeed * 1.0);
  if (timeTaken > timeRequired) {
    return false;
  }
  return true;
}
bool isPossible(int s, double timeRequired) {
  int raySpeed = s;
  vector<pair<int, int> > ansLeft;
  for (int i = 0; i < Left.size(); i++) {
    int currPosition = Left[i].first;
    int currSpeed = Left[i].second;
    int low = currPosition;
    int up = 1000000;
    while (low < up) {
      int mid = low + (up - low + 1) / 2;
      if (canReachLeftStop(currPosition, mid, currSpeed, raySpeed,
                           timeRequired)) {
        low = mid;
      } else {
        up = mid - 1;
      }
    }
    bool ans =
        canReachLeftStop(currPosition, low, currSpeed, raySpeed, timeRequired);
    if (ans) ansLeft.push_back(pair<int, int>(currPosition, low));
  }
  vector<pair<int, int> > ansRight;
  for (int i = 0; i < Right.size(); i++) {
    int currPosition = Right[i].first * 1.0;
    int currSpeed = Right[i].second * 1.0;
    int low = 0;
    int up = currPosition;
    while (low < up) {
      int mid = low + (up - low) / 2;
      if (canReachRightStop(currPosition, mid, currSpeed, raySpeed,
                            timeRequired)) {
        up = mid;
      } else {
        low = mid + 1;
      }
    }
    bool ans =
        canReachRightStop(currPosition, low, currSpeed, raySpeed, timeRequired);
    if (ans) ansRight.push_back(pair<int, int>(low, currPosition));
  }
  if (ansLeft.empty() || ansRight.empty()) {
    return false;
  }
  for (int i = 0; i <= 1000000; i++) {
    f[i] = 0;
  }
  sort(ansLeft.begin(), ansLeft.end());
  int leftMax = ansLeft[0].first - 1;
  for (int i = 0; i < ansLeft.size(); i++) {
    if (ansLeft[i].second <= leftMax) {
      continue;
    }
    if (ansLeft[i].second > leftMax) {
      for (int j = leftMax + 1; j <= ansLeft[i].second; j++) {
        f[j] = 1;
      }
      leftMax = ansLeft[i].second;
    }
  }
  for (int i = 0; i <= 1000000; i++) {
    g[i] = 0;
  }
  sort(ansRight.begin(), ansRight.end());
  int rightMax = ansRight[0].first - 1;
  for (int i = 0; i < ansRight.size(); i++) {
    if (ansRight[i].second <= rightMax) {
      continue;
    }
    if (ansRight[i].second > rightMax) {
      for (int j = rightMax + 1; j <= ansRight[i].second; j++) {
        g[j] = 1;
      }
      rightMax = ansRight[i].second;
    }
  }
  for (int i = 0; i <= 1000000; i++) {
    if (f[i] && g[i]) {
      return true;
    }
  }
  for (int i = 0; i < Left.size(); i++) {
    double distance = Left[i].first * 1.0 - 0.0;
    double speed = Left[i].second * 1.0;
    double timeTaken = distance / speed;
    if (!(timeTaken > timeRequired)) {
      return true;
    }
  }
  for (int i = 0; i < Right.size(); i++) {
    double distance = 1000000 * 1.0 - Right[i].first * 1.0;
    double speed = Right[i].second * 1.0;
    double timeTaken = distance / speed;
    if (!(timeTaken > timeRequired)) {
      return true;
    }
  }
  return false;
}
int main() {
  int n, s;
  in(n);
  in(s);
  double maxTime = -1 * 1.0;
  for (int i = 1; i <= n; i++) {
    int x, v, t;
    in(x);
    in(v);
    in(t);
    if (t == 1) {
      Left.push_back(pair<int, int>(x, v));
      maxTime = max(maxTime, (x * 1.0 - 0 * 1.0) / (v * 1.0));
    } else {
      Right.push_back(pair<int, int>(x, v));
      maxTime = max(maxTime, (1000000 * 1.0 - x * 1.0) / (v * 1.0));
    }
  }
  int turns = 50;
  double low = 0.0;
  double up = 1e6;
  while (turns--) {
    double mid = low + (up - low) / (2 * 1.0);
    if (isPossible(s, mid)) {
      up = mid;
    } else {
      low = mid;
    }
  }
  double ans = low;
  printf("%.6lf\n", ans);
}
