#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
struct Sync_stdio {
  Sync_stdio() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
  }
} _sync_stdio;
struct FAIL {
  FAIL() {
    cout << "CHANGE!!!"
         << "\n";
  }
};
struct Z {
  int x;
  int v;
  int t;
};
const int FINISH = 1000000;
double f(double x, double vx, double vs, double time) {
  double vmid = x / time;
  double t1 = -time / vs * (vmid - vx - vs);
  return min(t1 * vs + (time - t1) * (vs + vx), 2e6);
}
bool ok(const vector<Z> &v, int s, double mid) {
  vector<int> pos1(FINISH + 2);
  vector<int> pos2(FINISH + 2);
  int n = v.size();
  for (int i = (0); i < (n); ++i) {
    if (v[i].t == 1) {
      if (v[i].x <= mid * v[i].v) {
        ++pos1[0];
        --pos1[FINISH + 1];
        continue;
      }
      if (v[i].x > mid * (v[i].v + s)) {
        continue;
      }
      int pos = f(v[i].x, v[i].v, s, mid);
      pos = min(pos, FINISH);
      ++pos1[v[i].x];
      --pos1[pos + 1];
    } else {
      if ((FINISH - v[i].x) <= mid * v[i].v) {
        ++pos2[0];
        --pos2[FINISH + 1];
        continue;
      }
      if ((FINISH - v[i].x) > mid * (v[i].v + s)) {
        continue;
      }
      int pos = FINISH - (int)f(FINISH - v[i].x, v[i].v, s, mid);
      pos = max(pos, 0);
      ++pos2[pos];
      --pos2[v[i].x + 1];
    }
  }
  for (int i = (1); i < (FINISH + 2); ++i) {
    pos1[i] += pos1[i - 1];
    pos2[i] += pos2[i - 1];
  }
  for (int i = (0); i < (FINISH + 2); ++i) {
    if (pos1[i] && pos2[i]) {
      return true;
    }
  }
  return false;
}
int main() {
  int n, s;
  cin >> n >> s;
  cout << fixed << setprecision(10);
  vector<Z> v(n);
  for (int i = (0); i < (n); ++i) {
    cin >> v[i].x >> v[i].v >> v[i].t;
  }
  double l = 0;
  double r = FINISH;
  for (int t = (0); t < (70); ++t) {
    double mid = (l + r) / 2;
    if (ok(v, s, mid)) {
      r = mid;
    } else {
      l = mid;
    }
  }
  cout << l << "\n";
}
