#include<iostream>
#include<complex>
#include<vector>
#include<cmath>

#define fr first
#define sc second

#define FRONT 0x01
#define RIGHT 0x02
#define BACK 0x04
#define LEFT 0x08
#define OVER 0x10

using namespace std;

typedef double elem;
typedef complex<elem> point,vec;
typedef pair<point,point> pp,seg,line;

const elem pi = 2.0*acos(0.0);
const elem eps = 1.0e-12;
const elem infty = 1.0e+18;

inline bool eq(elem a, elem b){return abs(b-a) < eps;}
inline bool leq(elem a, elem b){return eq(a,b) || a < b;}
inline bool geq(elem a, elem b){return eq(a,b) || a > b;}
inline bool lt(elem a, elem b){return !eq(a,b) && a < b;}
inline bool gt(elem a, elem b){return !eq(a,b) && a > b;}
inline bool ltz(elem a){return lt(a,0);}
inline bool gtz(elem a){return gt(a,0);}
inline elem emax(elem a, elem b){return gt(a,b)?a:b;}
inline elem emin(elem a, elem b){return lt(a,b)?a:b;}
inline elem dot(point a, point b){return a.real()*b.real() + a.imag()*b.imag();}
inline elem cross(point a, point b){return a.real()*b.imag()-a.imag()*b.real();}
inline elem dist_l(line l,point x){ return abs(cross(l.sc-l.fr,x-l.fr))/abs(l.sc-l.fr); }
inline elem dist_seg(seg s, point x){
  if( ltz( dot(s.sc-s.fr,x-s.fr) ) ) return abs(x-s.fr);
  if( ltz( dot(s.fr-s.sc,x-s.sc) ) ) return abs(x-s.sc);
  return dist_l(s,x);
}
inline int ccw(point a, point b, point x){
  b-=a;x-=a;
  if(gtz(cross(b,x)))return LEFT;
  if(ltz(cross(b,x)))return RIGHT;
  if(ltz(dot(b,x)))return BACK;
  if(abs(b)<abs(x))return FRONT;
  return OVER;
}
inline bool intersected_seg(seg a, seg b){
  if( ccw(a.fr,a.sc,b.fr)&OVER || ccw(a.fr,a.sc,b.sc)&OVER ) return true;
  
  return
    ( ccw(a.fr,a.sc,b.fr) | ccw(a.fr,a.sc,b.sc) ) == (LEFT|RIGHT) &&
    ( ccw(b.fr,b.sc,a.fr) | ccw(b.fr,b.sc,a.sc) ) == (LEFT|RIGHT) ;
  return ( leq( cross(a.sc-a.fr,b.fr-a.fr) * cross(a.sc-a.fr,b.sc-a.fr), 0 ) &&
	   leq( cross(b.sc-b.fr,a.fr-b.fr) * cross(b.sc-b.fr,a.sc-b.fr), 0 ) );
}

class cuboid{
public:
  elem h;
  elem minx, miny;
  elem maxx, maxy;
  point tl,bl,tr,br;
  cuboid():minx(0),miny(0),
	 maxx(0),maxy(0),h(0){}
  cuboid(elem minx, elem miny, elem maxx, elem maxy,elem h):
    minx(minx),miny(miny),
    maxx(maxx),maxy(maxy),h(h),
    tl(minx,maxy),bl(minx,miny),tr(maxx,maxy),br(maxx,miny){}
  bool intersected_seg(seg l){
    /*
      cout << " INTERSECTED_SEG : " << endl;
      cout << ::intersected_seg(l,seg(tl,tr)) << endl;
      cout << ::intersected_seg(l,seg(tl,bl)) << endl;
      cout << ::intersected_seg(l,seg(tr,br)) << endl;
      cout << ::intersected_seg(l,seg(bl,br)) << endl;
    */
    if( ::intersected_seg(l,seg(tl,tr)) ||
	::intersected_seg(l,seg(tl,bl)) ||
	::intersected_seg(l,seg(tr,br)) ||
	::intersected_seg(l,seg(bl,br)) ) return true;
    return false;
  }
  bool contain_seg(seg l){
    if( ccw(bl,br,l.fr)&(OVER|LEFT) &&
	ccw(br,tr,l.fr)&(OVER|LEFT) &&
	ccw(tr,tl,l.fr)&(OVER|LEFT) &&
	ccw(tl,bl,l.fr)&(OVER|LEFT)
	&&
	ccw(bl,br,l.sc)&(OVER|LEFT) &&
	ccw(br,tr,l.sc)&(OVER|LEFT) &&
	ccw(tr,tl,l.sc)&(OVER|LEFT) &&
	ccw(tl,bl,l.sc)&(OVER|LEFT) ) return true;
    return false;
  }
  elem getMinimumDistance(seg l){
    elem ret = infty;
    ret = emin( ret, dist_seg( l, tl ) );
    ret = emin( ret, dist_seg( l, tr ) );
    ret = emin( ret, dist_seg( l, bl ) );
    ret = emin( ret, dist_seg( l, br ) );
    ret = emin( ret, dist_seg( seg(tl,tr), l.fr ) );
    ret = emin( ret, dist_seg( seg(tl,tr), l.sc ) );
    ret = emin( ret, dist_seg( seg(tl,bl), l.fr ) );
    ret = emin( ret, dist_seg( seg(tl,bl), l.sc ) );
    ret = emin( ret, dist_seg( seg(bl,br), l.fr ) );
    ret = emin( ret, dist_seg( seg(bl,br), l.sc ) );
    ret = emin( ret, dist_seg( seg(tr,br), l.fr ) );
    ret = emin( ret, dist_seg( seg(tr,br), l.sc ) );
    return ret;
  }
  elem getRwithSphere(seg l){
    //cout <<"CONTAINS : "<<contain_seg(l)<<endl;
    //cout <<"INTERSECTED : " <<intersected_seg(l)<<endl;
    if(contain_seg(l) || intersected_seg(l))return 0;
    elem d = getMinimumDistance(l);
    //cout << " MIN D : " << d << endl;
    if(eq(d,0))return 0;
    if(geq(h,d))return d;
    elem theta = 2*atan(h/d);
    elem ret = sqrt( (pow(d,2)+pow(h,2))/(2*(1-cos(theta))) );
    return ret;
  }
};

int main(){
  //cout << intersected_seg( seg(point(10,0),point(0,0)), seg(point(10,5),point(0,5)) ) << endl;
  //return 0;
  while(true){
    int n;
    elem ans = infty;
    elem sx,sy,ex,ey;
    vector<cuboid> vcubo;
    scanf("%d",&n);
    if(n == 0) return 0;
    scanf("%lf%lf%lf%lf",&sx,&sy,&ex,&ey);
    point S(sx,sy), E(ex,ey);
    for(int i = 0; i < n; ++i){
      elem minx, miny, maxx, maxy, h;
      scanf("%lf%lf%lf%lf%lf",
	    &minx,&miny,&maxx,&maxy,&h);
      vcubo.push_back( cuboid(minx,miny,maxx,maxy,h) );
    }
    for(int i = 0; i < n; ++i){
      ans = emin( ans, vcubo[i].getRwithSphere( seg(S,E) ) );
    }
    printf("%.7lf\n", ans);
  }
  return 0;
}

Measured memory_bytes: 0