#include<cstdio>
#include<cmath>
#include<utility>
#include<vector>
#include<complex>
#include<algorithm>

using namespace std;

typedef double Real;
typedef complex<Real> Point;
typedef pair<Point,Point> Line;
typedef pair<Point,Point> Segment;
typedef vector<Point> Polygon;

const Real eps=1e-9;
const Real inf=1e9;

Point NPoint=Point(NAN,NAN);

void print(Point p,char ch='\n'){
	printf("(%f %f)%c",p.real(),p.imag(),ch);
}

template<class T> bool eq(T a, T b){
	return abs(a-b)<eps;
}

template<class T> int sgn(T a){
	if(eq(a,(Real)0)) return 0;
	return a>0?1:-1;
}

bool onSeg(Point a,Point b,Point c){
	return eq(abs(a-b),abs(a-c)+abs(c-b));
}

bool onSeg(Segment s,Point p){
	return onSeg(s.first,s.second,p);
}

Real doP(Point a,Point b){
	return (conj(a)*b).real();
}

Real crP(Point a,Point b){
	return (conj(a)*b).imag();
}

Point proj(Point p,Point b){
	return b*doP(p,b)/norm(b);
}

bool isPara_(Point a,Point b){
	return eq(crP(a,b),(Real)0);
}

bool isPara_(Line l1,Line l2){
	return isPara_(l1.second-l1.first,l2.second-l2.first);
}

Point iLL(Line l1,Line l2){
	if(isPara_(l1,l2)) return NPoint;
	Point a1=l1.first,a2=l1.second;
	Point b1=l2.first,b2=l2.second;
	Real num=crP(b1-a1,a2-a1);
	Real den=crP(a2-a1,b2-b1);
	return b1+(b2-b1)*(num/den);
}

Point perp(Line l,Point a){
	Point p=l.first,q=l.second;
	return p+proj(a-p,q-p);
}

Real dPS(Point p,Segment s){
	Point h=perp(s,p);
	if(onSeg(s,h)) return abs(h-p);
	return min(abs(s.first-p),abs(s.second-p));
}

bool iSS_(Segment s1,Segment s2){
	Point p1=s1.first,q1=s1.second;
	Point p2=s2.first,q2=s2.second;
	if(isPara_(s1,s2)){
		return onSeg(s1,p2)||onSeg(s1,q2)||onSeg(s2,p1)||onSeg(s2,q1);
	}
	Point p=iLL(s1,s2);
	return onSeg(s1,p)&&onSeg(s2,p);
}

Real dSS(Segment s1,Segment s2){
	Real res=inf;
	if(iSS_(s1,s2)) return 0;
	res=min(res,dPS(s1.first,s2));
	res=min(res,dPS(s1.second,s2));
	res=min(res,dPS(s2.first,s1));
	res=min(res,dPS(s2.second,s1));
/*	print(s1.first);
	print(s1.second);
	print(s2.first);
	print(s2.second);
	printf("%f\n",res);*/
	return res;
}


Real calc(Real d,Real h){
	if(h>d) return d;
	return (d*d+h*h)/(2.0*h);
}

Real calc(Segment s1,Segment s2,Real h){
	Real d=dSS(s1,s2);
	if(sgn(d)<=0) return 0;
	return calc(d,h);
}

bool check(Real mx,Real my,Real Mx,Real My,Real x,Real y){
	return sgn(mx-x)<=0&&sgn(my-y)<=0&&sgn(Mx-x)>=0&&sgn(My-y)>=0;
}

vector<Segment> segs;
vector<Real> hs;
Point s,e;
Segment seg;
int N;

Real solve(){
	Real res=inf;
	for(int i=0;i<segs.size();i++){
		res=min(res,calc(segs[i],seg,hs[i]));
	}
	return res;
}

void init(){
	segs.clear();
	hs.clear();
}

Point readPoint(){
	Real x,y;
	scanf("%lf%lf",&x,&y);
	return Point(x,y);
}

bool input(){
	scanf("%d",&N);
	if(N==0) exit(0);
	s=readPoint();
	e=readPoint();
	seg=Segment(s,e);
	bool flg=true;
	for(int i=0;i<N;i++){
		Point p1=readPoint();
		Point p3=readPoint();
		Real h;
		scanf("%lf",&h);
		flg&=(!check(p1.real(),p1.imag(),p3.real(),p3.imag(),s.real(),s.imag()));
		Point p2=Point(p3.real(),p1.imag());
		Point p4=Point(p1.real(),p3.imag());
		segs.push_back(Segment(p1,p2));
		segs.push_back(Segment(p2,p3));
		segs.push_back(Segment(p3,p4));
		segs.push_back(Segment(p4,p1));
		for(int j=0;j<4;j++) hs.push_back(h);
	}
	return flg;
}

int main(){
	while(true){
		init();
		bool flg=input();
		if(flg==false){
			printf("0\n");
			continue;
		}
		Real ans=solve();
		printf("%f\n",ans);
	}
	return 0;
}

Measured memory_bytes: 1160