#include <iostream>
#include <cstdio>
#include <vector>
#include <complex>
#include <cmath>
#include <algorithm>
using namespace std;

// * XYツ催?標
#define X real()
#define Y imag()

// * ツ点ツづ個表ツ個サ
typedef complex<double> P;

// * ツ仰鳴容ツつキツづゥツ古ォツ債キツε?
const double EPS = 1e-10;
// * Infinity
const double INF = 1e12;
// * ツ円ツ偲シツ猟ヲ
const double PI = acos(-1.0);
// * Infinity 2
const P INF_P(INF,INF);

// * complex<double> ツづ個渉?渉伉づーツ津ィツ義ツつキツづゥ
namespace std {
	bool operator < (const P& a, const P& b) {
		return (real(a) != real(b))? real(a) < real(b) : imag(a) < imag(b);
	}
}

// * 2ツ湘ヲツつキツづゥ
double sq(double x) {
	return x * x;
}

// * 2ツ点ツ甘板づ個仰猟猟」
double dist(P p1, P p2) {
	return abs(p1 - p2);
}

// * 2ツづつづ個スツカツδ可ーツつェツ督卍つオツつ「ツつゥツづ?つ、ツつゥ
bool equal(double a, double b) {
	return ( fabs( a - b ) < EPS );
}
// * 2ツづつづ個ベツクツトツδ仰つェツ督卍つオツつ「ツつゥツづ?つ、ツつゥ
bool eq_v(P a, P b) {
	return ( equal( a.X, b.X ) && equal( a.Y, b.Y ) );
}

// ツベツクツトツδ蟻ツづ個単ツ暗環ベツクツトツδ仰づーツ仰?づ淞づゥ
P unit(P a) {
	return a / abs(a);
}

// ツベツクツトツδ蟻ツづ個法ツ静シツベツクツトツδ仰づーツ仰?づ淞づゥ
vector<P> normal(P a) {
	vector<P> vp;
	vp.push_back( a * P(0,  1) );
	vp.push_back( a * P(0, -1) );
	return vp;
}

// ツベツクツトツδ?a ツづ個単ツ暗環法ツ静シツベツクツトツδ仰づーツ仰?づ淞づゥ
vector<P> normal_unit(P a) {
	vector<P> vp;
	vp.push_back( (a * P(0,  1)) / abs(a) );
	vp.push_back( (a * P(0, -1)) / abs(a) ) ;
	return vp;
}

// * ツ禿?静?(dot product) : aツ・b = |a||b|cosツδヲ
double dot(P a, P b) {
	return real( conj(a) * b );
}

// * ツ外ツ静?(cross product) : aツ×b = |a||b|sinツδヲ
double cross(P a, P b) {
	return imag( conj(a) * b ) ;
}

// CCW : ツ板スツ篠楪計ツ嘉アツづィ (Counter Clock Wise)
// CW : ツ篠楪計ツ嘉アツづィ (Clock Wise)
enum {CCW=1, CW=-1, ON=0};
// * 3ツ点ツつェツづ?つソツづァツ嘉アツづィツづ?つ?づゥツつゥツ陛板つキ, 3ツ点ツつェ1ツ陳シツ静シツづ可湘ヲツづ?づ?つ「ツづゥツづ?つォツづ?ON ツづーツ陛板つキ
int ccw(const P &a, P b, P c) {
    b-=a, c-=a;
    if( cross(b,c) >  EPS ) return CCW; // CCW : ツ板スツ篠楪計ツ嘉アツづィ
    if( cross(b,c) < -EPS ) return CW;  // CW : ツ篠楪計ツ嘉アツづィ
    if(dot(b, c) < -EPS )   return +2;  // c--a--b on line
    if(dot(b, b) + EPS < dot(c, c) ) return -2; // a--b--c on line ???
    return ON;
}

// ツδ可ジツアツδ督つゥツづァツ度ツ青板づ鳴陛渉環キツつオツづ?陛板つキ
double to_deg(double rad) {
	return rad * 180.0 / PI;
}

// ツ度ツ青板つゥツづァツδ可ジツアツδ督づ可陛渉環キツつオツづ?陛板つキ
double to_rad(double deg) {
	return deg * PI / 180.0;
}

// ツ個エツ点ツづーツ篠イツづ可点 p ツづーツ角ツ度 a (ツδ可ジツアツδ?ツつセツつッツ嘉アツ転ツつウツつケツつスツ点ツづーツ陛板つキ
P rot(P p, double a){
	double x = p.X * cos(a) - p.Y * sin(a);
	double y = p.X * sin(a) + p.Y * cos(a);
	return P(x,y);
}

// ツ点 a ツづーツ篠イツづ可点 b ツづーツ角ツ度 a (ツδ可ジツアツδ?ツつセツつッツ嘉アツ転ツつウツつケツつスツ点ツづーツ陛板つキ
P rot2(P a, P b, double angle){
	P p = b - a;
	return rot( p , angle ) + a;
}

// ツ点 a ツつゥツづァ ツ点 b ツづ鳴づ個角ツ度ツづーツ陛板つキ [0,2ツε讃
double dir(P a, P b) {
	P p = a - b;
	double angle = atan2( p.Y , p.X );
	if( p.X < 0 ) angle += PI;
	if( angle < 0 ) angle += 2.0 * PI;
	return angle;
}

// ツ静シツ閉ェツクツδ可ス
struct Segment{
    P a, b;
    Segment(P a_, P b_){
        a = a_; b = b_;
    }
    // ツ点 p ツづ?静シツ閉ェツづ個仰猟猟」ツづーツ陛板つキ.
    double distance(P p){
        if( dot(b-a,p-a) < EPS ) return abs(p-a);
        if( dot(a-b,p-b) < EPS ) return abs(p-b);
        return abs( cross(b-a,p-a) ) / abs(b-a) ;
    }
    // ツ静シツ閉ェ s ツづ?古ーツ債キツつオツづ?つ「ツづゥツつゥツづ?つ、ツつゥツづーツ陛板つキ.
    bool is_intersection(const Segment& s){
        return ( ccw(a, b, s.a)   * ccw(a, b, s.b) <= 0 && 
                 ccw(s.a, s.b, a) * ccw(s.a, s.b, b) <= 0 );
    }
    // ツ点 p ツつェツ静シツ閉ェツ湘」ツづ可つ?づゥツつゥツづ?つ、ツつゥ
    bool contain(P p) { return (abs(a-p) + abs(p-b) < abs(a-b) + EPS); }
    // ツ静シツ閉ェツづ?静シツ閉ェツづ個仰猟猟」
    double distance(Segment s) {
        if( is_intersection(s) ) return 0.0;
        return min( min(distance(s.a), distance(s.b)), min(s.distance(a), s.distance(b)) );
    }
    // ツデツバツッツグツ出ツ療?
    void print(){
        printf("line(%f,%f,%f,%f);\n", a.X ,a.Y, b.X, b.Y );
    }
};

// ツ陳シツ静シツづ個表ツ個サ ((*this)[0]) ツづ?((*this)[1]) ツづーツ津環づゥツ陳シツ静シ
struct Line : public vector<P> {
	Line(const P &a, const P &b) {
		push_back(a); push_back(b);
	}
	Line(vector<P> v){
		push_back(v[0]); push_back(v[1]);
	}
	Line(){}
	// 2ツ陳シツ静シツづ個陳シツ古ーツ板サツ津ィ
	bool orthogonal(const Line& l) {
		return equal( dot( (*this)[0] - (*this)[1] , l[0] - l[1] ) , 0.0 );
	}
	// 2ツ陳シツ静シツづ個閉スツ行ツ板サツ津ィ
	bool parallel(const Line& l) {
		return equal( cross( (*this)[0] - (*this)[1] , l[0] - l[1] ), 0.0 );
	}
	// ツ点 p ツつェツ陳シツ静シツ湘」ツづ可湘ヲツづ?づ?つ「ツづゥツつゥ
	bool contain(P p) {
		return equal( cross( (*this)[1] - (*this)[0] , p - (*this)[0] ) , 0.0 );
	}
	// ツ陳シツ静シツづ?点 p ツづ個仰猟猟」
	double distance(P a) {
		P p1 = (*this)[0];
		P p2 = (*this)[1];
		return abs( cross( p2 - p1 , a - p1) ) / abs(p2 - p1);
	}
	// ツ陳シツ静シツづ個古ーツ債キツ板サツ津ィ
	bool is_intersection(const Line& l) {
		return !equal( cross( (*this)[0] - (*this)[1], l[0] - l[1] ) , 0.0 );
	}
	// ツ陳シツ静シツづ個古ーツ債キツ板サツ津ィツづ?古ーツ点ツ計ツ算
	bool intersection(Line l, P& p) {
		bool result = this->is_intersection( l );
		if( result ) {
			P a = (*this)[1] - (*this)[0];
			P b = l[1] - l[0];
			p = (*this)[0] + a * cross(b, l[0] - (*this)[0]) / cross(b, a);
		}else {
			p = INF_P;
		}
		return result;
	}
	// ツ点 (*this)[0] ツつゥツづァ ツ点 (*this)[1] ツづ鳴づ個角ツ度ツづーツ陛板つキ [0,2ツε讃
	double get_dir() {
		P p = (*this)[0] - (*this)[1];
		double angle = atan2( p.Y , p.X );
		if( p.X < 0 ) angle += PI;
		if( angle < 0 ) angle += 2.0 * PI;
		return angle;
	}
};

// ツ円ツづ個表ツ個サ
struct Circle{
	// ツ円ツづ個陳?心
	P p;
	// ツ円ツづ個板シツ径
	double r;
	// ツコツδ督スツトツδ可クツタツづ?渉可甘コツ可サ
	Circle(P p_, double r_) { p = p_; r = r_; }
	// ツ円ツづ個姪環静?
	double get_area() { return r * r * PI; }
	// ツ円ツ偲シ
	double circumference() { return 2.0 * r * PI; }
	// ツ点 a ツつェツ円ツづ個禿?閉板づ可つ?づゥツつゥツづ?つ、ツつゥ
	bool is_inside(P a) { return ( dist(a,p) <= r ); }
	// ツ点 a ツつェツ円ツ偲シツ湘」ツづ可つ?づゥツつゥツづ?つ、ツつゥ
	bool on_boundary(P a) { return equal( dist(a,p) , r ); }
	// ツ角ツ度 [a,b] ツづ個古環づ個陳キツつウツづーツ陛板つキ (a,bツづ債δ可ジツアツδ?
	double arc(double a, double b) {
		while( a > b ) b += 2.0 * PI;
		return r * (b - a);
	}
	// ツ円ツ偲シツ湘」ツづ個点 a,b ツづ個古環づ個陳キツつウツづーツ陛板つキ. 
	// (ツ円ツ偲シツ湘」ツづ個点ツづ?づ按つ「ツづ?つォツづ? ツ円ツづ個陳?心 p ツづ?点 a ツづーツ個仰づアツづ?古ーツ債キツつキツづゥツ点ツづーツ点 a ツづ?つキツづゥ.ツ点 b ツづ?督ッツ様) 
	double arc(P a, P b){
		P p1 = a - p;
		double angle1 = atan2( p1.Y , p1.X );
		if( p1.X < 0 ) angle1 += PI;
		if( angle1 < 0 ) angle1 += 2.0 * PI;
		P p2 = b - p;
		double angle2 = atan2( p2.Y , p2.X );
		if( p2.X < 0 ) angle2 += PI;
		if( angle2 < 0 ) angle2 += 2.0 * PI;
		return this->arc( angle1 , angle2 );
	}
	// ツ角ツ度 [a,b] ツづ個静ョツ形ツづ個姪環静渉づーツ陛板つキ (a,bツづ債δ可ジツアツδ?
	double sector(double a, double b) {
		while( a > b ) b += 2.0 * PI;
		return 0.5 * r * r * (b - a);
	}
	// ツ円ツ偲シツ湘」ツづ個点 a,b ツづ?円ツづ個陳?心 p ツつゥツづァツづ按づゥツ静ョツ形ツづ個姪環静渉づーツ陛板つキ. 
	// (ツ円ツ偲シツ湘」ツづ個点ツづ?づ按つ「ツづ?つォツづ? ツ円ツづ個陳?心 p ツづ?点 a ツづーツ個仰づアツづ?古ーツ債キツつキツづゥツ点ツづーツ点 a ツづ?つキツづゥ.ツ点 b ツづ?督ッツ様) 
	double sector(P a, P b){
		P p1 = a - p;
		double angle1 = atan2( p1.Y , p1.X );
		if( p1.X < 0 ) angle1 += PI;
		if( angle1 < 0 ) angle1 += 2.0 * PI;
		P p2 = b - p;
		double angle2 = atan2( p2.Y , p2.X );
		if( p2.X < 0 ) angle2 += PI;
		if( angle2 < 0 ) angle2 += 2.0 * PI;
		return this->sector( angle1 , angle2 );
	}
	// ツ陳シツ静シツづ?円ツづ個仰猟猟」 (ツ円ツづ個陳?心ツづ個点ツづ?陳シツ静シツづ個仰猟猟」 - ツ円ツづ個板シツ径)
	double distance(Line l){
		return l.distance( p ) - r;
	}
	// ツ点 a ツづーツ津環づゥツ静堋静シツづーツ陛板つキ.
	pair<Line,Line> tangent(P a) {
		pair<Line,Line> pl;
		if( this->on_boundary( a ) ) { // ツ点 a ツつェツ円ツ偲シツ湘」ツづ可つ?づゥツづ?つォ
			Line l( normal(a - p) ); // ツ法ツ静シツベツクツトツδ?
			l[0] += a;
			l[1] += a;
			pl.first = pl.second = l ;
			return pl;
		}else if( !this->is_inside(a) ) { // ツ点 a ツつェツ円ツづ個外ツ堕、ツづ可つ?づゥツづ?つォ
			double xp = a.X - p.X;
			double yp = a.Y - p.Y;
			double A = sqrt( sq(xp) + sq(yp) - sq(r) );
			double B = sq(xp) + sq(yp);
			P p1( r * (xp * r + yp * A) / B , r * (yp * r - xp * A) / B );
			P p2( r * (xp * r - yp * A) / B , r * (yp * r + xp * A) / B );
			pl.first = Line( a , p1+p );
			pl.second = Line( a , p2+p );
		}else{ // ツ点 a ツつェツ円ツづ個禿?堕、ツづ可つ?づゥツづ?つォ
			pl.first = pl.second = Line(INF_P,INF_P);
		}
		return pl;
	}
	// ツ督卍つオツつ「ツつゥツづ?つ、ツつゥ
	bool operator==(const Circle& c) { return (p == c.p && r == c.r) ; };
	// 2ツづつづ個円ツづ個暗環置ツ甘鳴係
	// 2 ツづつづ個円ツつェツ猟」ツづェツづ?つ「ツづゥ => 0
	// 2 ツづつづ個円ツつェツ外ツ静堋つキツづゥ   => 1
	// 2 ツづつづ個円ツつェツ古ーツづュツづゥ     => 2
	// 2 ツづつづ個円ツつェツ禿?静堋つキツづゥ    => 3 (2ツづつづ個円ツつェツ督卍つオツつ「ツづ?つォツづ債禿?静?
	// ツ円ツつェツ甘慊づ慊づェツづ?つ「ツづゥ       => 4
	int is_pos(const Circle& c) {
		double d = abs(p - c.p);
		if( r + c.r + EPS < d ) { // ツ猟」ツづェツづ?つ「ツづゥ
			return 0;
		}else if( equal( r + c.r , d ) ) { // ツ外ツ静堋つキツづゥ
			return 1;
		}else if( equal( fabs(r-c.r) , d ) ) { // ツ禿?静堋つキツづゥ
			return 3;
		}else if( d < fabs(r-c.r) ) { // ツ甘慊づ慊づェツづゥ
			return 4;
		}else { // ツ古ーツづュツづゥ	
			return 2;
		}
	}
	// ツ円ツづ?陳シツ静シツづ個古ーツづュツづゥツ点ツづーツ陛板つキ
	pair<P,P> intersection(Line l) {
		pair<P,P> pp;
		if( this->distance(l) > EPS ) { // ツ円ツづ?陳シツ静シツづ個古ーツ点ツつェツづ按つ「ツづ?つォ	
			pp.first = pp.second = INF_P;
		}else { // ツ円ツづ?陳シツ静シツづ個古ーツ点ツつェツつ?づゥツづ?つォ
			double d = l.distance( p );
			double angle = -l.get_dir();
			// ツ点 l[0] ツづーツ篠イツづ可点 l[1] ツづ?円ツづ個陳?心ツづーツ嘉アツ転
			P lp = rot2( l[0] , l[1] , angle );
			P cp = rot2( l[0] , p    , angle );
			double x1 = cp.X - sqrt( sq(r) - sq(d) );
			double x2 = cp.X + sqrt( sq(r) - sq(d) );
			P p1(x1,l[0].Y);
			P p2(x2,l[0].Y);
			// ツ嘉アツ転ツつオツづ?個ウツづ可姪淞つキ
			p1 = rot2( l[0] , p1 , -angle );
			p2 = rot2( l[0] , p2 , -angle );
			pp.first = p1;
			pp.second = p2;
		}
		return pp;
	}
	// ツデツバツッツグツ出ツ療?
	void print() { printf("circle(%f,%f,%f); \n", p.X, p.Y, r ); }
};


int main(){
	int N;
	while( cin >> N , N ){
		int sx, sy, ex, ey;
		cin >> sx >> sy >> ex >> ey;
		P S(sx,sy), E(ex,ey);
		Segment SE( S , E );
		
		bool flag = false;
		vector<Segment> v;
		for(int i=0 ; i < N ; i++ ){
			int min_x, min_y, max_x, max_y, h;
			cin >> min_x >> min_y >> max_x >> max_y >> h;
			Segment s1( P(min_x,min_y) , P(min_x,max_y) );
			Segment s2( P(min_x,min_y) , P(max_x,min_y) );
			Segment s3( P(min_x,max_y) , P(max_x,max_y) );
			Segment s4( P(max_x,min_y) , P(max_x,max_y) );
			if( min_x <= sx && sx <= max_x && min_y <= sy && sy <= max_y ){
				flag = true;
			}else if( min_x <= ex && ex <= max_x && min_y <= ey && ey <= max_y ){
				flag = true;
			}else if( SE.is_intersection(s1) || SE.is_intersection(s2) ){
				flag = true;
			}else if( SE.is_intersection(s3) || SE.is_intersection(s4) ){
				flag = true;
			}else if( !flag ){
				double d = min( SE.distance(s1), SE.distance(s2) );
				d = min( d , min( SE.distance(s3), SE.distance(s4) ) );
				P p1(d,0);
				P p2(d,h);
				v.push_back( Segment(p1,p2) );
			}
		}
		
		if( flag ){
			cout << 0 << endl;
		}else{
			double low=0, high=1000, mid;
			for(int i=0 ; i < 100 ; i++ ){
				mid = (low+high) / 2.0;
				Circle c( P(0,mid) , mid );
				bool flag = false;
				for(int j=0 ; j < v.size() ; j++ ){
					Line l( v[j].a , v[j].b );
					pair<P,P> pp = c.intersection( l );
					if( pp.first == pp.second ) continue;
					if( v[j].contain( pp.first ) || v[j].contain( pp.second ) ){
						flag = true;
					}
				}
				if( flag ){
					high = mid;
				}else{
					low = mid;
				}
			}
			printf("%.8f\n", mid);
		}
	}
}

Measured memory_bytes: 1032