#include<bits/stdc++.h>
using namespace std;
#define EPS 1e-10
double inf = 1e9;
struct point{
    double x,y;
    point(){}
    point(double x,double y):x(x),y(y){}
    point operator + (point p){return point(x+p.x,y+p.y); }
    point operator - (point p){return point(x-p.x,y-p.y); }
    point operator * (double k ){ return point(x*k,y*k); }
    double norm() { return x*x + y* y;}
    double abs() { return sqrt(norm());}
    void make() { cin>>x>>y;}
};
struct line{
    point s,t;
    line(){}
    line(point s,point t):s(s),t(t){}
    void make(){ s.make(),t.make();}
};
double abs(point p){return p.abs();}

double dot(point a,point b){return a.x*b.x+a.y*b.y;}
double cross(point a,point b){return a.x*b.y-a.y*b.x;}
int ccw(point p0,point p1,point p2){
    point a = p1-p0;
    point b = p2-p0;
    if( cross(a,b) > EPS) return 1;
    if( cross(a,b) < -EPS) return -1;
    if( dot(a,b) < -EPS) return 2;
    if(a.norm() < b.norm() )return -1;
    return 0;
}
bool intersect(point p0,point p1,point p2,point p3){
    return (ccw(p0,p1,p2) *ccw(p0,p1,p3)<=0 && ccw(p2,p3,p0)*ccw(p2,p3,p1)<=0 ); 
}
bool intersect(line l1,line l2){
    return intersect(l1.s,l1.t,l2.s,l2.t); 
}
double distancelp(line l,point p){ return abs( cross(l.t-l.s,p-l.s) / (l.t-l.s).abs() ); }
double distance(line l,point p){
    if(dot(l.t-l.s,p-l.s) < 0.0) return abs(p-l.s);
    if(dot(l.s-l.t,p-l.t) < 0.0) return abs(p-l.t);
    return distancelp(l,p);
}
double distance(line l1,line l2){
    if(intersect(l1,l2)) return 0.0;
    return min( min(distance(l1,l2.s)   , distance(l1,l2.t)) , min(distance(l2,l1.s),distance(l2,l1.t) ) );
}
bool check(line l,double r){
    point o = point(0,r);
   // cout<<r<<' '<<distance(l,o)<<endl;
    if( distance(l,o) >= r) return true;
    return false;
}

int main(){
    while(1){
        int n;
        cin>>n;
        if(n==0)break;
        line l;
        l.make();
        vector<double> d(n,inf);
        vector<double> h(n);
        for(int i=0;i<n;i++){
            //cout<<i<<endl;
            double mx,my,Mx,My;
            point a,b,c,dd;
            a.make();
            b.make();
            mx = min(a.x,b.x),Mx = max(a.x,b.x),my = min(a.y,b.y),My = max(a.y,b.y);
            c = point(a.x,b.y);
            dd = point(b.x,a.y);
            cin>>h[i];
            d[i] = min( distance(line(a,c) , l) , d[i]);
            d[i] = min( distance(line(a,dd) , l) , d[i]); 
            d[i] = min( distance(line(b,c) , l) , d[i]); 
            d[i] = min( distance(line(b,dd) , l) , d[i]); 

            if(mx<= l.s.x && l.s.x <= Mx && my<=l.s.y && l.s.y<=My ) d[i] = 0;
            if(mx<=l.t.x && l.t.x <= Mx && my <= l.t.y && l.t.y <=My )d[i] = 0;
        }
        vector<line> ls(n);
        //for(int i=0;i<n;i++)cout<<d[i]<<endl;
        double up = inf, low = 0;
        for(int i=0; i<n;i++) ls[i] = line(point(d[i],0.0),point(d[i],h[i]));
        while( up-low > EPS){
            double mid = (low + up)/2;
            bool flag = true;
            point o = point(0,mid);
            for(int i=0;i<n;i++){
                if(!check(ls[i],mid)){
                    flag = false;
                    break;
                }
            }
            if(flag){
                low = mid;
               // cout<<"true"<<endl;
            }else{
                up = mid;
            }
        }
        printf("%0.10lf\n",(low+up)/2);
    }
    return 0;
}



Measured memory_bytes: 3300