#include <bits/stdc++.h>
#define rep(i, a, n) for(int i = a; i < n; i++)
using namespace std;
typedef pair<int, int> P;
typedef complex<double> Point;
typedef pair<Point, Point> Line;
const double EPS = 1e-10;

// 2点間の距離
double dis(Point a, Point b){
	return abs(a - b);
}
// 内積 |a||b|cosθ
double dot(Point a, Point b){
	// return a.real() * b.real() + a.imag() * b.imag();
	return (conj(a) * b).real();
}
// 外積、符号付面積の２倍　|a||b|sinθ
double cross(Point a, Point b){
	// return a.real() * b.imag() - a.imag() * b.real();
	return (conj(a) * b).imag();
}
// 点の位置関係　2点a,bから見た点cの位置関係
int ccw(Point a, Point b, Point c){
    // COUNTER_CLOCKWISE
    if(cross(b - a, c - a) > EPS) return 1;
    // CLOCKWISE
    if(cross(b - a, c - a) < -EPS) return -1;
    // ONLINE_BACK
    if(dot(b - a, c - a) < -EPS) return 2;
    // ONLINE_FRONT
    if(abs(b - a) + EPS < abs(c - a)) return -2;
    // ON_SEGMENT
    return 0;
}
// 点と直線の距離
double line_to_point_dis(Line l, Point p){
    Point a = l.first, b = l.second, c = p;
    return fabs(cross(c - a, b - a)) / fabs(abs(b - a));
}
// 点と線分の距離
double seg_to_point_dis(Line l, Point p){
    Point a = l.first, b = l.second, c = p;
    if(dot(b - a, c - a) < EPS) return abs(c - a);
    if(dot(a - b, c - b) < EPS) return abs(c - b);
    return line_to_point_dis(l, p);
}
// 線分の交差判定
bool is_cross(Line a, Line b){
    if(ccw(a.first, a.second, b.first) * ccw(a.first, a.second, b.second) <= 0 && ccw(b.first, b.second, a.first) * ccw(b.first, b.second, a.second) <= 0){
        return true;
    }
    return false;
}

int n;
double h[51];
Point p[51][4];
Line se;

bool calc(double r){
    rep(i, 0, n){
        rep(j, 0, 4){
            double dist = seg_to_point_dis(se, p[i][j]);
            if(h[i] >= r){
                if(dist < r) return false;
            }else{
                double x = sqrt(pow(dist, 2) + pow(r - h[i], 2));
                if(x < r) return false;
            }
            Line tmp = {p[i][j], p[i][(j + 1) % 4]};
            double dist2 = seg_to_point_dis(tmp, se.first);
            if(h[i] >= r){
                if(dist2 < r) return false;
            }else{
                double x = sqrt(pow(dist2, 2) + pow(r - h[i], 2));
                if(x < r) return false;
            }
            double dist3 = seg_to_point_dis(tmp, se.second);
            if(h[i] >= r){
                if(dist3 < r) return false;
            }else{
                double x = sqrt(pow(dist3, 2) + pow(r - h[i], 2));
                if(x < r) return false;
            }
        }
    }
    return true;
}

bool isInside(Point p1, Point p2, Point x){
    if(p1.real() <= x.real() && x.real() <= p2.real() && p1.imag() <= x.imag() && x.imag() <= p2.imag()) return true;
    return false;
}

int main(){
    while(cin >> n, n){
        double sx, sy, ex, ey;
        cin >> sx >> sy >> ex >> ey;
        se = {{sx, sy}, {ex, ey}};
        bool f = true;        
        rep(i, 0, n){
            double x1, y1, x2, y2;
            cin >> x1 >> y1 >> x2 >> y2 >> h[i];
            p[i][0] = {x1, y1};
            p[i][1] = {x1, y2};
            p[i][2] = {x2, y2};
            p[i][3] = {x2, y1};
            if(isInside({x1, y1}, {x2, y2}, se.first)) f = false;
            if(isInside({x1, y1}, {x2, y2}, se.second)) f = false;
        }
        rep(i, 0, n){
            rep(j, 0, 4){
                Line tmp = {p[i][j], p[i][(j + 1) % 4]};
                if(is_cross(se, tmp)) f = false;
            }
        }
        if(f == false){
            cout << 0.0000 << endl;
            continue;
        }
        double r = 1000.0, l = 0.0;
        while(r - l > 0.00001){
            double mid = (l + r) / 2.0;
            if(calc(mid)) l = mid;
            else r = mid;
        }
        printf("%.10f\n", l);
    }
}


Measured memory_bytes: 3292