#include <stdio.h>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>

using namespace std;

#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

typedef complex<double> P;
typedef long long ll;

const double PI=4*atan(1.0);
const int MAX_SIZE = 10000;

// àÏ
double dot(P a, P b) {
  return (a.real() * b.real() + a.imag() * b.imag());
}
// OÏ
double cross(P a, P b) {
  return (a.real() * b.imag() - a.imag() * b.real());
}
// _cª¼üabãÉ é©È¢©
int is_point_on_line(P a, P b, P c) {
  return EQ( cross(b-a, c-a), 0.0 );
}
// 2¼üÌ¼s»è
int is_orthogonal(P a1, P a2, P b1, P b2) {
  return EQ( dot(a1-a2, b1-b2), 0.0 );
}
// 2¼üÌ½s»è
int is_parallel(P a1, P a2, P b1, P b2) {
  return EQ( cross(a1-a2, b1-b2), 0.0 );
}
// _a,bðÊé¼üÆ_cÌÔÌ£
double distance_l_p(P a, P b, P c) {
  return abs(cross(b-a, c-a)) / abs(b-a);
}
// _a,bð[_Æ·éüªÆ_cÆÌ£
double distance_ls_p(P a, P b, P c) {
  if ( dot(b-a, c-a) < EPS ) return abs(c-a);
  if ( dot(a-b, c-b) < EPS ) return abs(c-b);
  return abs(cross(b-a, c-a)) / abs(b-a);
}
// a1,a2ð[_Æ·éüªÆb1,b2ð[_Æ·éüªÌð·»è
int is_intersected_ls(P a1, P a2, P b1, P b2) {
    // üªª½sÈêÍdÈÁÄ¢È¢±ÆÉ·é
    if(abs(cross(a2-a1,b2-b1)) < EPS){
        return 0;
    }
    return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS ) &&
        ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS );
}
// a1,a2ð[_Æ·éüªÆb1,b2ð[_Æ·éüªÌð_vZ
P intersection_ls(P a1, P a2, P b1, P b2) {
  P b = b2-b1;
  double d1 = abs(cross(b, a1-b1));
  double d2 = abs(cross(b, a2-b1));
  double t = d1 / (d1 + d2);

  return a1 + (a2-a1) * t;
}
// a1,a2ðÊé¼üÆb1,b2ðÊé¼üÌð·»è
int is_intersected_l(P a1, P a2, P b1, P b2) {
  return !EQ( cross(a1-a2, b1-b2), 0.0 );
}
// a1,a2ðÊé¼üÆb1,b2ðÊé¼üÌð_vZ
P intersection_l(P a1, P a2, P b1, P b2) {
  P a = a2 - a1; P b = b2 - b1;
  return a1 + a * cross(b, b1-a1) / cross(b, a);
}
/*
~üÆüªÌð·»è
*/
bool isCircleCrossLine(P a,P b,P c,double r){
	double d1 = abs(a-c);
	double d2 = abs(b-c);
	//if(d1<r&&d2<r)
	//	return true;
	double d = distance_ls_p(a,b,c);
	return (EQ(d,r)||d<r);
}
// Op`ÌàÉ_ª é©Ç¤©
// OÏÌ³ª·×Ä¯¶ÈçàÉ_ è
bool isInTriangle(P p1,P p2,P p3,P s){
	P a=p1-s;
	P b=p2-s;
	P c=p3-s;
	return ((cross(a,b)>0&&cross(b,c)>0&&cross(c,a)>0)||(cross(a,b)<0&&cross(b,c)<0&&cross(c,a)<0));
}
bool isInRectangle(P p1,P p2,P p3,P p4,P s){
	P a=p1-s;
	P b=p2-s;
	P c=p3-s;
    P d=p4-s;
	return ((cross(a,b)>0&&cross(b,c)>0&&cross(c,d)>0&&cross(d,a)<0)||(cross(a,b)<0&&cross(b,c)<0&&cross(c,d)<0&&cross(d,a)<0));
}
// Op`ÌÊÏðÀW©çvZ
double calcAreaOfTriangle(P a,P b,P c){
	return abs((b.real()-a.real())*(c.imag()-a.imag()) - (c.real()-a.real())*(b.imag()-a.imag()))/2;
}
// ^¦çê½~ÌÍÍàÉ_ª¶Ý·é©Ç¤©
bool isContainingDot(P c,double r,P a){
	return (((c.real()-a.real())*(c.real()-a.real())
		+(c.imag()-a.imag())*(c.imag()-a.imag())<r*r)
		||EQ((c.real()-a.real())*(c.real()-a.real())
		+(c.imag()-a.imag())*(c.imag()-a.imag()),r*r));
}
// ½p`ÌÊÏö®
double calcPolygonArea(vector<P> p){
	double sum=0;
	for(int i = 0; i < p.size(); i++)
		sum+=cross(p[i],p[(i+1)%(p.size())]);
	return sum/2;
}
// 2xNgÔÌpx
// a©çbÖ¶üèÅ½x©(0->2*PI)
double diffAngle(P a,P b){
    double angle=atan2(cross(a,b),dot(a,b));
    if(angle<0)
        return 2*PI+angle;
    return angle;
}

class Object{
public:
    int minx,miny,maxx,maxy,h;
};

int n;
int sx,sy,ex,ey;
vector<Object> objects;
const double INF=100000;

bool check(double r){
    for(int i = 0; i < objects.size(); i++){
        // startn_Ægoaln_É éªÔÂ©é©Ì`FbN
        double h=objects[i].h;
        double useR=sqrt(2*h*r-h*h);
        if(!(r>objects[i].h||EQ(r,objects[i].h)))
            useR=r;
        vector<pair<P, P> > rect;
        rect.push_back(make_pair(P(objects[i].minx,objects[i].miny),P(objects[i].minx,objects[i].maxy)));
        rect.push_back(make_pair(P(objects[i].minx,objects[i].miny),P(objects[i].maxx,objects[i].miny)));
        rect.push_back(make_pair(P(objects[i].maxx,objects[i].maxy),P(objects[i].maxx,objects[i].miny)));
        rect.push_back(make_pair(P(objects[i].maxx,objects[i].maxy),P(objects[i].minx,objects[i].maxy)));
        for(int j = 0; j < rect.size(); j++){
            if(isCircleCrossLine(rect[j].first,rect[j].second,P(sx,sy),useR)
                ||isCircleCrossLine(rect[j].first,rect[j].second,P(ex,ey),useR)){
                return false;
            }
        }
        if(isContainingDot(P(sx,sy),useR,P(objects[i].minx,objects[i].miny))
            &&isContainingDot(P(sx,sy),useR,P(objects[i].minx,objects[i].maxy))
            &&isContainingDot(P(sx,sy),useR,P(objects[i].maxx,objects[i].miny))
            &&isContainingDot(P(sx,sy),useR,P(objects[i].maxx,objects[i].maxy))){
                return false;
        }
        if(isContainingDot(P(ex,ey),useR,P(objects[i].minx,objects[i].miny))
            &&isContainingDot(P(ex,ey),useR,P(objects[i].minx,objects[i].maxy))
            &&isContainingDot(P(ex,ey),useR,P(objects[i].maxx,objects[i].miny))
            &&isContainingDot(P(ex,ey),useR,P(objects[i].maxx,objects[i].maxy))){
                return false;
        }
        // X^[gn_ÌQ_ÆS[n_ÌQ_ðßé
        P ss1,ss2,gg1,gg2;
        P e=P(sx-ex,sy-ey);e/=abs(e);
        e=P(-e.imag(),e.real());
        ss1=e*useR+P(sx,sy);
        ss2=-e*useR+P(sx,sy);
        gg1=e*useR+P(ex,ey);
        gg2=-e*useR+P(ex,ey);
        if(objects[i].minx<=sx
            &&objects[i].maxx>=sx
            &&objects[i].miny<=sy
            &&objects[i].maxy>=sy
            ){
                return false;
        }
        if(objects[i].minx<=ex
            &&objects[i].maxx>=ex
            &&objects[i].miny<=ey
            &&objects[i].maxy>=ey
            ){
                return false;
        }
        //  éé`àÉ_ª¶Ý·é©`FbN
        if(isInRectangle(ss1,ss2,gg2,gg1,P(objects[i].minx,objects[i].miny))
            ||isInRectangle(ss1,ss2,gg2,gg1,P(objects[i].minx,objects[i].maxy))
            ||isInRectangle(ss1,ss2,gg2,gg1,P(objects[i].maxx,objects[i].miny))
            ||isInRectangle(ss1,ss2,gg2,gg1,P(objects[i].maxx,objects[i].maxy))
            )
        {
            return false;
        }

        // üªÌyAðSi[µASär·é
        vector<pair<P,P> > lines;
        lines.push_back(make_pair(ss1,gg1));
        lines.push_back(make_pair(ss2,gg2));
        // Çê©êÂÅàüªªÔÂ©êÎI¹
        for(int j = 0; j < lines.size(); j++)
            for(int k = 0; k < rect.size(); k++)
                if(is_intersected_ls(lines[j].first,lines[j].second,rect[k].first,rect[k].second))
                    return false;
    }
    return true;
}

int main(){
    while(cin>>n&&n!=0){
        cin>>sx>>sy>>ex>>ey;
        objects.clear();
        for(int i = 0; i < n; i++){
            Object o;
            cin>>o.minx>>o.miny>>o.maxx>>o.maxy>>o.h;
            objects.push_back(o);
        }
        double ub=INF;
        double lb=0;
        while(ub-lb>EPS){
            double med=(ub+lb)/2;
            if(check(med))
                lb=med;
            else
                ub=med;
        }
        printf("%.6f\n",ub);
        //cout<<ub<<endl;
    }

    return 0;
}

Measured memory_bytes: 988