#include<bits/stdc++.h>
#define eps 1e-9
using namespace std;
typedef complex<double> point;
typedef pair<point, point> line;

//b??????a??????????????????
double dis(point a, point b){
  return abs(a - b);
}

//??????
double dot(point a, point b){
  return a.real()*b.real() + a.imag()*b.imag();
}

//??????
double cross(point a, point b){
  return imag(conj(a) * b);
}

//counter clock wise
int ccw(point a, point b, point c){
  if(cross(b - a, c - a) >  eps)return  1;//??????ab????????´
  if(cross(b - a, c - a) < -eps)return -1;//??????ab????????´
  if(dot(b - a, c - a) < -eps)return 2;//??´???ab??????a???????????????
  if(abs(b - a) + eps < abs(c - a))return -2;//??´???ab??????b???????????????
  return 0;//??´???ab???
}

double line_to_point_dis(line l, point p){
  return abs(cross(p - l.first, l.second - l.first))/
    abs(l.second - l.first);
}

double seg_to_point_dis(line l, point p){
  point a = l.first, b = l.second, c = p;
  if(dot(b - a, c - a) < eps)return abs(c - a);
  if(dot(a - b, c - b) < eps)return abs(c - b);
  return line_to_point_dis(l, p);
}

bool is_cross(line a, line b){
  if(ccw(a.first, a.second, b.first) *
     ccw(a.first, a.second, b.second) <= 0 &&
     ccw(b.first, b.second, a.first) *
     ccw(b.first, b.second, a.second) <= 0){
    return true;
  }
  return false;
}

double seg_to_seg_dis(line a, line b){
  if(is_cross(a, b))return 0;
  double res = seg_to_point_dis(a, b.first);
  res = min(res, seg_to_point_dis(a, b.second));
  res = min(res, seg_to_point_dis(b, a.first));
  res = min(res, seg_to_point_dis(b, a.second));
  return res;
}


point cross_point(line a, line b){
  double d1 = cross(b.second - b.first,
                    b.first - a.first);
  double d2 = cross(b.second - b.first,
                    a.second - a.first);
  return a.first + (a.second - a.first) * d1/d2;
}

pair<point, point> norm(point p){
  return pair<point, point>(p*point(0, 1),
                            p*point(0, -1));
}

typedef struct rectangle{
  rectangle(){};
  rectangle(point _a, point _b, int _h){
    a = _a, b = _b, h = _h;
    double x[] = {a.real(), a.real(), b.real(), b.real()};
    double y[] = {a.imag(), b.imag(), b.imag(), a.imag()};
    for (int i = 0; i < 4; i++) {
      point u = point(x[i], y[i]),
        v = point(x[(i+1)%4], y[(i+1)%4]);
      l.emplace_back(line(u, v));
    }
  }
  point a, b;
  vector<line> l;
  double h;
}rectangle;

vector<rectangle> vr;

bool renge(point a, point b, point c){
  return (a.real() <= c.real() and c.real() <= b.real() and
          a.imag() <= c.imag() and c.imag() <= b.imag());
}

bool is_ok(line l, double h){
  point s = l.first, e = l.second;
  for (int i = 0; i < vr.size(); i++) {
    double mh = min(h, vr[i].h);
    double dist = 1e9;
    for (int j = 0; j < 4; j++) {
      dist = min(dist, seg_to_seg_dis(l, vr[i].l[j]));
    }
    double theta = acos((h - mh)/h);
    double r = h*sin(theta);
    if(renge(vr[i].a, vr[i].b, s) and
       renge(vr[i].a, vr[i].b, e))return false;
    if(r > dist)return false;
  }
  return true;
}
  
int main(){
  int n, sx, sy, ex, ey;
  while(std::cin >> n, n){
    vr.clear();
    std::cin >> sx >> sy >> ex >> ey;
    point s = point(sx, sy), e = point(ex, ey);
    for (int i = 0; i < n; i++) {
      double minx, miny, maxx, maxy, h;
      std::cin >> minx >> miny >> maxx >> maxy >> h;
      rectangle r(point(minx, miny), point(maxx, maxy), h);
      vr.emplace_back(r);
    }
    double l = 0, r = 1000, mid = (l + r)/2;
    for (int i = 0; i < 500; i++) {
      if(is_ok(line(s, e), mid)){
        l = mid;
      }else{
        r = mid;
      }
      mid = (l + r)/2;
    }
    if(mid > eps)printf("%.10lf\n", mid);
    else std::cout << 0 << std::endl;
  }
  return 0;
}

Measured memory_bytes: 3584