#include"bits/stdc++.h"

using namespace std;

#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,m,n) for(int i=(m);i<(n);i++)

const double EPS = 1e-6;
typedef complex<double> point;
point operator*(const point&p, const double &d) {
	return point(real(p)*d, imag(p)*d);
}
namespace std {
	bool operator < (const point& a, const point& b) {
		return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
	}
}
//直線or線分
struct Line : public vector<point> {
	Line(const point &a, const point &b) {
		push_back(a); push_back(b);
	}
};
//外積
double cross(const point& a, const point& b) {
	return imag(conj(a)*b);
}
//内積
double dot(const point& a, const point& b) {
	return real(conj(a)*b);
}
int ccw(point a, point b, point c) {
	b -= a; c -= a;
	if (cross(b, c) > 0)   return +1;       // counter clockwise
	if (cross(b, c) < 0)   return -1;       // clockwise
	if (dot(b, c) < 0)     return +2;       // c--a--b on line
	if (norm(b) < norm(c)) return -2;       // a--b--c on line
	return 0;
}
//交差判定
bool intersectLL(const Line &l1, const Line &l2) {
	return abs(cross(l1[1] - l1[0], l2[1] - l2[0])) > EPS || //non-parallel
		abs(cross(l1[1] - l1[0], l2[0] - l1[0])) < EPS; //same line
}
bool intersectLS(const Line &l, const Line &s) {
	return cross(l[1] - l[0], s[0] - l[0])* // s[0] is left of l
		cross(l[1] - l[0], s[1] - l[0]) < EPS; // s[1] is right of l
}
bool intersectLP(const Line &l, const point &p) {
	return abs(cross(l[1] - p, l[0] - p)) < EPS;
}
bool intersectSS(const Line &s, const Line &t) {
	return ccw(s[0], s[1], t[0])*ccw(s[0], s[1], t[1]) <= 0 &&
		ccw(t[0], t[1], s[0])*ccw(t[0], t[1], s[1]) <= 0;
}
bool intersectSP(const Line &s, const point &p) {
	return abs(s[0] - p) + abs(s[1] - p) - abs(s[1] - s[0]) < EPS; //triangle inequality
}
//距離,交点
//射影 直線lにpから下した垂線との交点
point projection(const Line &l, const point &p) {
	double t = dot(p - l[0], l[0] - l[1]) / norm(l[0] - l[1]);
	return l[0] + (l[0] - l[1])*t;
}
//射影 直線lを対象軸としてpと線対称にある点
point reflection(const Line &l, const point &p) {
	return p + (projection(l, p) - p)*2;
}
double distancePP(const point& a, const point& b) {
	return sqrt(norm(a - b));
}
double distanceLP(const Line &l, const point &p) {
	return abs(p - projection(l, p));
}
double distanceLL(const Line&l, const Line &m) {
	return intersectLL(l, m) ? 0 : distanceLP(l, m[0]);
}
double distanceLS(const Line &l, const Line &s) {
	if (intersectLS(l, s))return 0;
	return min(distanceLP(l, s[0]), distanceLP(l, s[1]));
}
double distanceSP(const Line &s, const point &p) {
	const point r = projection(s, p);
	if (intersectSP(s, r))return abs(r - p);
	return min(abs(s[0] - p), abs(s[1] - p));
}
double distanceSS(const Line &s, const Line &t) {
	if (intersectSS(s, t))return 0;
	return min({ distanceSP(s,t[0]),distanceSP(s,t[1]),distanceSP(t,s[0]),distanceSP(t,s[1]) });
}
point crosspoint(const Line &l, const Line &m) {
	double A = cross(l[1] - l[0], m[1] - m[0]);
	double B = cross(l[1] - l[0], l[1] - m[0]);
	if (abs(A) < EPS&&abs(B) < EPS)return m[0];//same line
	if (abs(A) < EPS)assert(false); // Precondition not satisfied
	return m[0] + B / A * (m[1] - m[0]);
}
double dist(point &p1, point &p2) {
	return abs(p1 - p2);
}

//円
struct Circle {
	point p; double r;
	Circle(const point &p, double r) : p(p), r(r) { }
};

//凸包
vector<point> convex_hull(vector<point> ps) {
	int n = ps.size(), k = 0;
	sort(ps.begin(), ps.end());
	vector<point> ch(2 * n);
	for (int i = 0; i < n; ch[k++] = ps[i++]) // lower-hull
		while (k >= 2 && ccw(ch[k - 2], ch[k - 1], ps[i]) <= 0) --k;
	for (int i = n - 2, t = k + 1; i >= 0; ch[k++] = ps[i--]) // upper-hull
		while (k >= t && ccw(ch[k - 2], ch[k - 1], ps[i]) <= 0) --k;
	ch.resize(k - 1);
	return ch;
}

//2点を通る半径Rの円の中心
pair<point, point> get_circle_from_2points(point &p1, point &p2, double R) {
	double d = dist(p1, p2);
	double x1 = p1.real(), x2 = p2.real();
	double y1 = p1.imag(), y2 = p2.imag();
	if (p1.imag() == p2.imag()) {
		double x = (x1 + x2) / 2.0;
		double dy = sqrt(R - d * d / 4);
		return { { x,y1 + dy },{ x,y1 - dy } };
	}
	else {
		double m = (x1 - x2) / (y2 - y1);
		double t = sqrt(R*R - d * d / 4);
		double dx = sqrt((t*t) / (m*m + 1));
		double dy = sqrt(t*t - dx * dx);
		double gx = (x1 + x2) / 2;
		double gy = (y1 + y2) / 2;
		if (m > EPS) {
			return { { gx + dx,gy + dy },{ gx - dx,gy - dy } };
		}
		else {
			return { { gx + dx,gy - dy },{ gx - dx,gy + dy } };
		}
	}
}
//長方形
struct Square {
	double lx, ly, rx, ry;
	double h;
	Square(double lx_, double ly_, double rx_, double ry_, double h_) :lx(lx_), ly(ly_), rx(rx_), ry(ry_), h(h_) {};
	bool include(point &p) {
		return p.real()+EPS >= lx && p.real()-EPS <= rx && p.imag()+EPS >= ly && p.imag()-EPS <= ry;
	}
};

clock_t start;
clock_t end_t;
void solve() {
	int N; cin >> N;
	if (N == 0)exit(0);
	double sx, sy, gx, gy;
	cin >> sx >> sy >> gx >> gy;
	point s = { sx,sy };
	point g = { gx,gy };
	vector<Square>Ss;
	REP(i, N) {
		double lx, ly, rx, ry, h;
		cin >> lx >> ly >> rx >> ry >> h;
		Square S(lx, ly, rx, ry,h);
		Ss.push_back(S);
	}
	double ok = 0, ng = 1000;
	Line sg(s, g);
	REP(_, 100) {
		double mid = (ok+ng)/2;
		double r = mid;
		vector<Square>S = Ss;
		bool possible = true;
		vector<double>d;
		REP(i, N) {
			if (S[i].h < r) {
				double diff = sqrt(r*r - (r - S[i].h)*(r - S[i].h));
				d.push_back(diff);
				//S[i].lx -= diff;
				//S[i].ly -= diff;
				//S[i].rx += diff;
				//S[i].ry += diff;
			}
			else {
				double diff = r;
				d.push_back(diff);
				//S[i].lx -= diff;
				//S[i].ly -= diff;
				//S[i].rx += diff;
				//S[i].ry += diff;
			}
		}
		//sかgが含まれていたらアウト
		REP(i, N) {
			if (S[i].include(s))possible = false;
			if (S[i].include(g))possible = false;
		}
		//交差判定
		REP(i, N) {
			vector<point>ps(4);
			ps[0] = { S[i].lx,S[i].ly };
			ps[1] = { S[i].lx,S[i].ry };
			ps[2] = { S[i].rx,S[i].ry };
			ps[3] = { S[i].rx,S[i].ly };
			REP(k, 4) {
				Line s(ps[k], ps[(k + 1) % 4]);
				if (distanceSS(s, sg) <= d[i]) {

					//cout << s[0] << " " << s[1] << " " << sg[0] <<" "<<sg[1] << endl;
					//cout << "distance:" << distanceSS(s, sg) << endl;
					//cout << "d:" << d[i] << endl;
					possible = false;
				}
			}
		}
		if (possible)ok = mid;
		else ng = mid;
	}
	printf("%.10lf\n", ok);
}
signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	start = clock();
	while (true)solve();
}


Measured memory_bytes: 3356