#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#define EPS 1e-10
using namespace std;

double add(double a,double b){
	if(fabs(a+b)<EPS*(fabs(a)+fabs(b)))return 0.0;
	return a+b;
}

class Point{
public:
	double x,y;
	Point(){}
	Point(double xx,double yy){
		x=xx;
		y=yy;
	}
	Point operator+(Point p){
		return Point(add(x,p.x),add(y,p.y));
	}
	Point operator-(Point p){
		return Point(add(x,-p.x),add(y,-p.y));
	}
	Point operator*(double d){
		return Point(x*d,y*d);
	}
	Point operator/(double d){
		return Point(x/d,y/d);
	}
};

class Segment{
public:
	Point p1,p2;
	Segment(){}
	Segment(Point pp1,Point pp2){
		p1=pp1;
		p2=pp2;
	}
};

typedef Point Vector;
typedef Segment Line;
typedef vector<Point> Polygon;

double norm(Vector v){
	return add(v.x*v.x,v.y*v.y);
}

double abs(Vector v){
	return sqrt(norm(v));
}

double dot(Vector a,Vector b){
	return add(a.x*b.x,a.y*b.y);
}

double cross(Vector a,Vector b){
	return add(a.x*b.y,-a.y*b.x);
}

int ccw(Point p0,Point p1,Point p2){
	Vector a=p1-p0;
	Vector b=p2-p0;
	if(cross(a,b)>EPS)return 1;
	if(cross(a,b)<-EPS)return -1;
	if(dot(a,b)<-EPS)return 2;
	if(norm(a)<norm(b))return -2;
	return 0;
}

bool intersect(Point p1,Point p2,Point p3,Point p4){
	return (ccw(p1,p2,p3)*ccw(p1,p2,p4)<=0 && ccw(p3,p4,p1)*ccw(p3,p4,p2)<=0);
}

bool intersect(Segment s1,Segment s2){
	return intersect(s1.p1,s1.p2,s2.p1,s2.p2);
}


double getDistanceLP(Line l,Point p){
	return abs(cross(l.p2-l.p1,p-l.p1)/abs(l.p2-l.p1));
}

double getDistanceSP(Segment s,Point p){
	if(dot(s.p2-s.p1,p-s.p1)<0.0)return abs(p-s.p1);
	if(dot(s.p1-s.p2,p-s.p2)<0.0)return abs(p-s.p2);
	return getDistanceLP(s,p);
}

double getDistance(Segment s1,Segment s2){
	if(intersect(s1,s2))return 0.0;
	return min(min(getDistanceSP(s1,s2.p1),getDistanceSP(s1,s2.p2)),min(getDistanceSP(s2,s1.p1),getDistanceSP(s2,s1.p2)));
}

bool contains(Polygon g,Point p){
	int n=g.size();
	bool x=false;
	for(int i=0;i<n;i++){
		Point a=g[i]-p,b=g[(i+1)%n]-p;
		if(abs(cross(a,b))<EPS && dot(a,b)<EPS)return true;
		if(a.y>b.y)swap(a,b);
		if(a.y<EPS && EPS<b.y && cross(a,b)>EPS)x=!x;
	}
	return x;
}
int n;
Point s,e;
double minx[51],maxx[51],miny[51],maxy[51],h[51];

bool check(){
	for(int i=0;i<n;i++){
		if(intersect(Segment(s,e),Segment(Point(minx[i],miny[i]),Point(maxx[i],miny[i]))))return false;
		if(intersect(Segment(s,e),Segment(Point(minx[i],miny[i]),Point(minx[i],maxy[i]))))return false;
		if(intersect(Segment(s,e),Segment(Point(maxx[i],maxy[i]),Point(maxx[i],miny[i]))))return false;
		if(intersect(Segment(s,e),Segment(Point(maxx[i],maxy[i]),Point(minx[i],maxy[i]))))return false;
		Polygon p;
		p.push_back(Point(minx[i],miny[i]));
		p.push_back(Point(maxx[i],miny[i]));
		p.push_back(Point(maxx[i],maxy[i]));
		p.push_back(Point(minx[i],maxy[i]));
		if(contains(p,s) || contains(p,e))return false;
	}
	return true;
}


bool C(double r){
	for(int i=0;i<n;i++){
		Point p1=Point(minx[i],miny[i]);
		Point p2=Point(maxx[i],miny[i]);
		Point p3=Point(minx[i],maxy[i]);
		Point p4=Point(maxx[i],maxy[i]);
		double dist=getDistance(Segment(s,e),Segment(p1,p2));
		dist=min(dist,getDistance(Segment(s,e),Segment(p1,p3)));
		dist=min(dist,getDistance(Segment(s,e),Segment(p4,p2)));
		dist=min(dist,getDistance(Segment(s,e),Segment(p4,p3)));
		if(h[i]<r){
			dist=sqrt(dist*dist+(r-h[i])*(r-h[i]));
		}
		if(dist<r)return false;
	}
	return true;
}

int main(void){
	while(1){
		scanf("%d",&n);
		if(n==0)break;
		scanf("%lf %lf %lf %lf",&s.x,&s.y,&e.x,&e.y);
		for(int i=0;i<n;i++){
			scanf("%lf %lf %lf %lf %lf",&minx[i],&miny[i],&maxx[i],&maxy[i],&h[i]);
		}
		if(!check()){
			printf("0\n");
			continue;
		}
		double l=0.0,r=1000.1;
		for(int i=0;i<100;i++){
			double mid=(l+r)/2.0;
			if(C(mid))l=mid;
			else r=mid;
		}
		printf("%.9f\n",l);
	}
	return 0;
}

Measured memory_bytes: 1108