#include <iostream>
#include <vector>
#include <algorithm>
#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>
#include <stack>
#include <climits>

using namespace std;
typedef long long ll;
double EPS=1e-10;
typedef pair<int,int> pii;
bool EQ(double a,double b){
	return abs(a-b)<EPS;
}

struct Block{
	int minx;
	int maxx;
	int miny;
	int maxy;
	int h;
	Block(){}
	Block(int minx_,int miny_,int maxx_,int maxy_,int h_){
		minx=minx_;
		miny=miny_;
		maxx=maxx_;
		maxy=maxy_;
		h=h_;
	}
};
int sy,sx,ey,ex;
Block blocks[101];

typedef complex<double> P;

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 isInPolygon(vector<P> &points,P s){
	if(points.size()==1)return false;
	vector<P> v;
	for(int i=0;i<points.size();i++)v.push_back(points[i]-s);
	int sign=0;
	for(int i=1;i<=v.size();i++){
		int prv=(i-1+v.size())%v.size();
		int cur=i%v.size();
		double c=cross(v[prv],v[cur]);
		if(EQ(c,0))continue;
		else if(sign==0){
			if(c>0)sign=1;
			else sign=-1;
		}
		else{
			if(sign==-1&&c>0)return false;
			else if(sign==1&&c<0)return false;
		}
	}
	return true;
}
// ツ静シツ閉ェツづ?点ツづ個仰猟猟」
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);
}

bool isTouchingCircleAndRec(P cp,double r,int bid){
	vector<pair<P,P> > lines;
	vector<P> v;
	v.push_back(P(blocks[bid].minx,blocks[bid].miny));
	v.push_back(P(blocks[bid].minx,blocks[bid].maxy));
	v.push_back(P(blocks[bid].maxx,blocks[bid].maxy));
	v.push_back(P(blocks[bid].maxx,blocks[bid].miny));
	for(int i=0;i<4;i++)
		lines.push_back(make_pair(v[i],v[(i+1)%4]));
	// 4dot
	for(int i=0;i<4;i++){
		double dist=abs(v[i]-cp);
		if(!(EQ(dist,r)||dist>r))
			return true;
	}
	// 4line
	for(int i=0;i<lines.size();i++){
		double dist=distance_ls_p(lines[i].first,lines[i].second,cp);
		if(!(EQ(dist,r)||dist>r))
			return true;
	}
	// inside 
	if(isInPolygon(v,cp))return true;
	return false;
}
bool is_intersected_ls(P a1,P a2,P b1,P b2){
	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);
}
struct Rec{
	vector<P> p;
};
bool isTouchRectangle(Rec &a,Rec &b){
	for(int i=0;i<4;i++)if(isInPolygon(b.p,a.p[i]))return true;
	for(int i=0;i<4;i++)if(isInPolygon(a.p,b.p[i]))return true;
	for(int i=0;i<4;i++){
		int curi=i;
		int prvi=(i+3)%4;
		for(int j=0;j<4;j++){
			int curj=j;
			int prvj=(j+3)%4;
			if(is_intersected_ls(a.p[curi],a.p[prvi],b.p[curj],b.p[prvj]))return true;
		}
	}
	return false;
}
P roundPoint(P p,double a){
	return P(cos(a)*p.real()-sin(a)*p.imag(),sin(a)*p.real()+cos(a)*p.imag());
}
const double PI=acos(-1.0);
int N;

bool check(double R){
	//R=29;
	for(int i=0;i<N;i++){
		double d=sqrt(R*R-(R-blocks[i].h)*(R-blocks[i].h));
		if(R<=blocks[i].h)d=R;
		if(isTouchingCircleAndRec(P(sx,sy),d,i))
			return false;
		if(isTouchingCircleAndRec(P(ex,ey),d,i))
			return false;
		vector<P> v;
		int bid=i;
		v.push_back(P(blocks[bid].minx,blocks[bid].miny));
		v.push_back(P(blocks[bid].minx,blocks[bid].maxy));
		v.push_back(P(blocks[bid].maxx,blocks[bid].maxy));
		v.push_back(P(blocks[bid].maxx,blocks[bid].miny));
		P e1=P(sx,sy)-P(ex,ey);e1/=abs(e1);e1*=d;
		P e2=P(ex,ey)-P(sx,sy);e2/=abs(e2);e2*=d;
		vector<P> v2;
		P a1=roundPoint(e1,PI/2)+P(sx,sy);
		P a2=roundPoint(e2,3*PI/2)+P(ex,ey);
		v2.push_back(a1);v2.push_back(a2);
		P a3=roundPoint(e1,3*PI/2)+P(sx,sy);
		P a4=roundPoint(e2,PI/2)+P(ex,ey);
		v2.push_back(a4);v2.push_back(a3);
		Rec r1;r1.p=v;
		Rec r2;r2.p=v2;
		if(isTouchRectangle(r1,r2))return false;
	}
	return true;
}

void solve(){
	while(cin>>N&&N){
		cin>>sx>>sy>>ex>>ey;
		for(int i=0;i<N;i++){
			int minx,miny,maxx,maxy,h;
			cin>>minx>>miny>>maxx>>maxy>>h;
			blocks[i]=Block(minx,miny,maxx,maxy,h);
		}
		double ub=1000000000;
		double lb=0;
		for(int i=0;i<200;i++){
			double mid=(ub+lb)/2;
			if(check(mid))lb=mid;
			else ub=mid;
		}
		if(EQ(ub,0))cout<<0<<endl;
		else
			printf("%.10f\n",ub);
	}
}

int main(){

	solve();

	return 0;
}

Measured memory_bytes: 1016