#include <bits/stdc++.h>
using namespace std;
using DO = double;
const int NN = 100010;
const DO eps = 1e-8;
int n, w, h;
DO e1, e2;
DO t[NN], x[NN], y[NN];
inline void smin(DO &x, const DO &y) {
  if (x > y) x = y;
}
inline void smax(DO &x, const DO &y) {
  if (x < y) x = y;
}
int can(DO v) {
  DO l = e1, r = e1;
  DO lx = (e1 + e2) / 2, ly = h * 0.5;
  for (int i = 1; i <= n; i++) {
    DO a1 = -(h - y[i]) / y[i], b1 = x[i] - a1 * x[i];
    DO a2 = -ly / (h - ly), b2 = lx - a2 * lx;
    DO a = a1 * a2, b = b2 + a2 * b1;
    DO d1 = v * (t[i] - t[i - 1]), d2 = -a2 * d1;
    DO l1 = max((DO)0, l - d1), r1 = min((DO)w, r + d1), l2, r2;
    smax(l1, (l - b - d2) / a);
    smin(r1, (r - b + d2) / a);
    smax(l1, x[i] + (w - x[i]) / a1);
    smin(r1, x[i] - x[i] / a1);
    if (a > 1 + eps) {
      l2 = (-d1 - d2 - b) / (a - 1);
      r2 = (d1 + d2 - b) / (a - 1);
    } else if (a < 1 - eps) {
      l2 = (d1 + d2 - b) / (a - 1);
      r2 = (-d1 - d2 - b) / (a - 1);
    } else {
      if (abs(b) > d1 + d2) return 0;
      l2 = 0;
      r2 = w;
    }
    smax(l1, l2);
    smin(r1, r2);
    l = l1;
    r = r1;
    if (l > r && l - r < eps) swap(l, r);
    if (l > r) return 0;
    lx = x[i];
    ly = y[i];
  }
  return 1;
}
int main() {
  cin >> n >> w >> h >> e1 >> e2;
  for (int i = 1; i <= n; i++) scanf("%lf%lf%lf", t + i, x + i, y + i);
  if (!can(w + 1)) return puts("-1");
  DO st = 0, ed = w;
  for (int i = 0; i < 30; i++) {
    DO md = (st + ed) / 2;
    if (can(md))
      ed = md;
    else
      st = md;
  }
  cout << fixed << setprecision(20) << st << endl;
  return 0;
}
