#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define mod 1000000000+7
const double EPS=1e-8;
using namespace std;
double add(double a,double b)
{
if(abs(a+b)<EPS*(abs(a)+abs(b)))
return 0;
return a+b;
}
struct P
{
double x,y;
P (){}
P(double x,double y):x(x),y(y){
}
P operator + (P p){
return P(add(x,p.x),add(y,p.y));
}
P operator -(P p){
return P(add(x,-p.x),add(y,-p.y));
}
P operator *(double d){
return P(x*d,y*d);
}
double det(P p){
return add(x*p.y,-y*p.x);
}
double dot(P p){
return add(x*p.x,y*p.y);
}
};
P p[20000],q[20000],r[20000];
struct node
{
double val;
int s,e,next;
}a[100000];
int root[100000];
int ans;
void add(int s,int e,double val)
{
a[++ans].e=e;
a[ans].val=val;
a[ans].next=root[s];
root[s]=ans;
}
int l=0,l2=0;
bool equ(P a,P b)
{
if(fabs(a.x-b.x)<=EPS && fabs(a.y-b.y)<=EPS)
return 1;
return 0;
}
bool judge(int i,int j)
{
for(int k=0;k<l;k++)
{
if(equ(q[k],r[i]) || equ(q[k],r[j]) || equ(p[k],r[i]) || equ(p[k],r[j]))
continue;
if((q[k]-r[i]).det(r[j]-r[i])*(p[k]-r[i]).det(r[j]-r[i])<EPS && (r[i]-q[k]).det(p[k]-q[k])*(r[j]-q[k]).det(p[k]-q[k])<EPS)
{
return 0;
}
}
return 1;
}
double dit(int i,int j)
{
double a=(r[i].x-r[j].x)*(r[i].x-r[j].x)+(r[i].y-r[j].y)*(r[i].y-r[j].y);
return sqrt(a);
}
double spfa()
{
int vis[100000];
double dis[100000];
for(int i=0;i<=l2;i++)
{
vis[i]=0;
dis[i]=0x7fffffff;
}
queue<int>q;
vis[0]=1;
dis[0]=0;
q.push(0);
while(!q.empty())
{
int s=q.front();
q.pop();
vis[s]=0;
for(int i=root[s];i!=-1;i=a[i].next)
{
if(dis[a[i].e]>dis[s]+a[i].val)
{
dis[a[i].e]=dis[s]+a[i].val;
if(!vis[a[i].e])
{
q.push(a[i].e);
vis[a[i].e]=1;
}
}
}
}
return dis[l2-1];
}
int main()
{
int n;
while(~scanf("%d",&n) && n!=-1)
{
l2=0,l=0;
memset(root,-1,sizeof(root));
ans=-1;
r[l2].x=0.0;
r[l2++].y=5.0;
double a,b,c,d,e,f;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e);
double x[100];
// x[0]=b,x[1]=c,x[2]=d,x[3]=e;
// sort(x,x+4);
// b=x[0],c=x[1],d=x[2],e=x[3];
p[l].x=a;
p[l].y=0.0;
q[l].x=a;
q[l].y=b;
l++;
p[l].x=a;
p[l].y=c;
q[l].x=a;
q[l].y=d;
l++;
p[l].x=a;
p[l].y=e;
q[l].x=a;
q[l].y=10.0;
l++;
r[l2].x=a;
r[l2++].y=b;
r[l2].x=a;
r[l2++].y=c;
r[l2].x=a;
r[l2++].y=d;
r[l2].x=a;
r[l2++].y=e;
}
r[l2].x=10.0;
r[l2++].y=5.0;
for(int i=0;i<l2;i++)
{
for(int j=i+1;j<l2;j++)
{
if(judge(i,j))
{
add(i,j,dit(i,j));
add(j,i,dit(i,j));
}
}
}
double aaaaa=spfa();
printf("%.2lf\n",aaaaa);
}
return 0;
}
计算几何判断线段相交+最短路