#include <bits/stdc++.h>
using namespace std;
int const N=100;
struct node{double x,y[4];};
node qiang[25];
bool is_ok(int i,int j,double x1,double y1,double x2,double y2)
{
for(int k=i+1;k<j;k++)
{
double y=(qiang[k].x-x1)/(x2-x1)*(y2-y1)+y1;
if((y>=qiang[k].y[0] && y<=qiang[k].y[1]) || (y>=qiang[k].y[2] && y<=qiang[k].y[3]))
continue;
return false;
}
return true;
}
double len(double x1,double y1,double x2,double y2)
{
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
vector < pair<int,double> > g[N];
priority_queue < pair<double,int> > q;
int n;
double dis[N];
bool vis[N];
void Dijkstra(int s)
{
for(int i=0;i<=4*n+1;i++) dis[i]=1e9;
dis[s]=0;
q.push({0,s});
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(auto e:g[u])
{
int v=e.first;
double w=e.second;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
q.push({-dis[v],v});
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
cin>>qiang[i].x>>qiang[i].y[0]>>qiang[i].y[1]>>qiang[i].y[2]>>qiang[i].y[3];
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int l=0;l<4;l++)
for(int r=0;r<4;r++)
if(is_ok(i,j,qiang[i].x,qiang[i].y[l],qiang[j].x,qiang[j].y[r]))
g[4*(i-1)+l+1].push_back({4*(j-1)+r+1,len(qiang[i].x,qiang[i].y[l],qiang[j].x,qiang[j].y[r])});
}
for(int j=0;j<4;j++)
{
if(is_ok(0,i,0,5,qiang[i].x,qiang[i].y[j])) g[0].push_back({4*(i-1)+j+1,len(0,5,qiang[i].x,qiang[i].y[j])});
if(is_ok(i,n+1,qiang[i].x,qiang[i].y[j],10,5)) g[4*(i-1)+j+1].push_back({4*n+1,len(qiang[i].x,qiang[i].y[j],10,5)});
}
}
Dijkstra(0);
cout<<setprecision(2)<<fixed<<dis[4*n+1]<<endl;
return 0;
}