#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <complex>
using namespace std;

typedef complex<double> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007
#define EPS (1e-10)

int SX, SY, TX, TY;
int N;

double dot(P a, P b) {
  return a.real()*b.real() + a.imag()*b.imag();
}
double cross(P a, P b) {
  return a.real()*b.imag() - a.imag()*b.real();
}
bool intersect(P a1, P a2, P b1, P b2) {
  return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < 0 ) &&
         ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < 0 );
}

double dist(P a, P b, P c) {
  if (dot(b-a, c-a) < 0) return abs(c-a);
  if (dot(a-b, c-b) < 0) return abs(c-b);
  return abs(cross(b-a, c-a)) / abs(b-a);
}
double f(double d, double h) {
  if (h >= d) return d;
  double lo = d, hi = 1e10;
  rep(_, 200) {
    double mid = (lo + hi) / 2;
    double t = mid / (mid/h - 1);
    double g = sqrt(t*t - h*h) * (mid/h - 1);
    if (d >= g) lo = mid;
    else hi = mid;
  }
  return lo;
}

signed main() {
  ios::sync_with_stdio(false); cin.tie(0);
  while (cin >> N) {
    if (N == 0) break;
    cin >> SX >> SY >> TX >> TY;
    double ans = 1e10;
    rep(i, N) {
      int lx, ly, rx, ry, h;
      cin >> lx >> ly >> rx >> ry >> h;
      if (intersect(P(SX, SY), P(TX, TY), P(lx, ly), P(lx, ry))) ans = 0;
      if (intersect(P(SX, SY), P(TX, TY), P(lx, ry), P(rx, ry))) ans = 0;
      if (intersect(P(SX, SY), P(TX, TY), P(rx, ry), P(rx, ly))) ans = 0;
      if (intersect(P(SX, SY), P(TX, TY), P(rx, ly), P(lx, ly))) ans = 0;
      if (lx<=min(SX,TX)&&ly<=min(SY,TY)&&rx>=max(SX,TX)&&ry>=max(SY,TY)) ans = 0;
      ans = min(ans, f(dist(P(SX, SY), P(TX, TY), P(lx, ly)), h));
      ans = min(ans, f(dist(P(SX, SY), P(TX, TY), P(lx, ry)), h));
      ans = min(ans, f(dist(P(SX, SY), P(TX, TY), P(rx, ly)), h));
      ans = min(ans, f(dist(P(SX, SY), P(TX, TY), P(rx, ry)), h));

      ans = min(ans, f(dist(P(lx, ly), P(lx, ry), P(SX, SY)), h));
      ans = min(ans, f(dist(P(lx, ry), P(rx, ry), P(SX, SY)), h));
      ans = min(ans, f(dist(P(rx, ry), P(rx, ly), P(SX, SY)), h));
      ans = min(ans, f(dist(P(rx, ly), P(lx, ly), P(SX, SY)), h));

      ans = min(ans, f(dist(P(lx, ly), P(lx, ry), P(TX, TY)), h));
      ans = min(ans, f(dist(P(lx, ry), P(rx, ry), P(TX, TY)), h));
      ans = min(ans, f(dist(P(rx, ry), P(rx, ly), P(TX, TY)), h));
      ans = min(ans, f(dist(P(rx, ly), P(lx, ly), P(TX, TY)), h));
    }
    cout << fixed << setprecision(20) << ans << "\n";
  }
  return 0;
}