#include <bits/stdc++.h>
using namespace std;
const double inf = 1e9 + 5;
const double eps = 0;
struct point {
  double x, y;
};
struct line {
  double A, B, C;
  line() {}
  line(point A, point B) {
    this->A = A.y - B.y;
    this->B = B.x - A.x;
    this->C = A.x * B.y - A.y * B.x;
  }
};
struct element {
  int index;
  double pos;
  bool type;
};
bool operator<(const element A, const element B) {
  if (A.pos != B.pos) return A.pos < B.pos;
  if (A.type != B.type) return A.type > B.type;
  return A.index < B.index;
}
point intersect(line A, line B) {
  point output;
  if ((B.B * A.A - A.B * B.A) == 0) return {inf, inf};
  output.y = (A.C * B.A - B.C * A.A) / (B.B * A.A - A.B * B.A);
  if ((B.A * A.B - A.A * B.B) == 0) return {inf, inf};
  output.x = (A.C * B.B - B.C * A.B) / (B.A * A.B - A.A * B.B);
  return output;
}
double sign(double x) {
  if (x < 0) return -1;
  if (x == 0) return 0;
  if (x > 0) return 1;
}
int pointCross, segmentCross;
double crossSegment(point startPoint, double vx, double vy, double x1,
                    double y1, double x2, double y2) {
  line l1 = line(startPoint, {startPoint.x + vx, startPoint.y + vy});
  line l2 = line({x1, y1}, {x2, y2});
  point P = intersect(l1, l2);
  if (P.x == inf && P.y == inf) return -1;
  if (P.x < x1 || P.x > x2) return -1;
  if (P.y < y1 || P.y > y2) return -1;
  if (sign(P.x - startPoint.x) != sign(vx) ||
      sign(P.y - startPoint.y) != sign(vy))
    return -1;
  if (P.x == x1 && P.y == y1)
    pointCross++;
  else if (P.x == x2 && P.y == y2)
    pointCross++;
  else
    segmentCross++;
  if (vx == 0 && vy == 0) return 0;
  if (vx != 0) return (P.x - startPoint.x) / vx;
  if (vy != 0) return (P.y - startPoint.y) / vy;
}
vector<element> v;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  double x1, x2, y1, y2;
  cin >> n;
  cin >> x1 >> y1 >> x2 >> y2;
  if (x1 > x2) swap(x1, x2);
  if (y1 > y2) swap(y1, y2);
  if (x1 == x2 || y1 == y2) {
    cout << "-1" << '\n';
    return 0;
  }
  for (int i = 0; i < n; i++) {
    double rx, ry;
    double vx, vy;
    double minTime = inf, maxTime = -1;
    bool inside = false;
    cin >> rx >> ry >> vx >> vy;
    if (rx >= x1 && rx <= x2 && ry >= y1 && ry <= y2) {
      inside = true;
      minTime = maxTime = 0;
    }
    if (rx > x1 && rx < x2 && ry > y1 && ry < y2 && vx == 0 && vy == 0) {
      minTime = 0;
      maxTime = inf;
      v.push_back({i, minTime, false});
      v.push_back({i, maxTime, true});
      continue;
    }
    pointCross = 0;
    segmentCross = 0;
    if (rx <= x1 && vx <= 0) {
      cout << "-1" << '\n';
      return 0;
    }
    if (rx >= x2 && vx >= 0) {
      cout << "-1" << '\n';
      return 0;
    }
    if (ry <= y1 && vy <= 0) {
      cout << "-1" << '\n';
      return 0;
    }
    if (ry >= y2 && vy >= 0) {
      cout << "-1" << '\n';
      return 0;
    }
    double t1 = crossSegment({rx, ry}, vx, vy, x1, y1, x2, y1);
    if (t1 > 0) {
      minTime = min(minTime, t1 + 0);
      maxTime = max(maxTime, t1 - 0);
    }
    t1 = crossSegment({rx, ry}, vx, vy, x1, y2, x2, y2);
    if (t1 > 0) {
      minTime = min(minTime, t1 + 0);
      maxTime = max(maxTime, t1 - 0);
    }
    t1 = crossSegment({rx, ry}, vx, vy, x1, y1, x1, y2);
    if (t1 > 0) {
      minTime = min(minTime, t1 + 0);
      maxTime = max(maxTime, t1 - 0);
    }
    t1 = crossSegment({rx, ry}, vx, vy, x2, y1, x2, y2);
    if (t1 > 0) {
      minTime = min(minTime, t1 + 0);
      maxTime = max(maxTime, t1 - 0);
    }
    if (maxTime == -1) {
      cout << "-1" << '\n';
      return 0;
    }
    if (pointCross == 2 && segmentCross == 0 && inside == false) {
      cout << "-1" << '\n';
      return 0;
    }
    v.push_back({i, minTime, false});
    v.push_back({i, maxTime, true});
  }
  sort(v.begin(), v.end());
  int cnt = 0;
  for (int i = 0; i < v.size(); i++) {
    if (v[i].type == false) {
      cnt++;
      if (cnt == n) {
        cout << fixed << setprecision(7) << v[i].pos << '\n';
        return 0;
      }
    } else {
      cnt--;
    }
  }
  cout << "-1" << '\n';
}
