//枚举第i和第j个转折点,求最大距离
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define eps 1e-8
#define dist(a,b) sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))
#define cross(a,b,c) (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)
#define dot(a,b,c) (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y)
#define delt(a) fabs(a)<eps?0:a>0?1:-1
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define N 100
#define inf 1234567890
using namespace std;
struct TPoint
{
double x,y;
TPoint(){}
TPoint(double _x,double _y):x(_x),y(_y){}
}ptu[N],ptd[N];
int n,m,t;
bool segcross(TPoint a,TPoint b,TPoint c,TPoint d,double &tmp)
{
double s1=cross(c,a,b),s2=cross(d,a,b);
int d1=delt(s1),d2=delt(s2);
if(d1*d2<0) tmp=(s2*c.x-s1*d.x)/(s2-s1);
else if(d1==0) tmp=c.x;
else if(d2==0) tmp=d.x;
else return 0;
return 1;
}
void solve()
{
int i,j,k;
double maxf=ptu[0].x,mid;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
if(!segcross(ptu[i],ptd[j],ptu[k],ptd[k],mid)) break;
}
if(k>=n)
{
puts("Through all the pipe."); return ;
}
if(k<max(i,j)) continue;
segcross(ptu[i],ptd[j],ptu[k-1],ptu[k],mid);
maxf=max(maxf,mid);
segcross(ptu[i],ptd[j],ptd[k-1],ptd[k],mid);
maxf=max(maxf,mid);
}
}
printf("%.2f\n",maxf);
}
int main()
{
int i,j,k;
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
{
scanf("%lf%lf",&ptu[i].x,&ptu[i].y);
ptd[i]=TPoint(ptu[i].x,ptu[i].y-1);
}
solve();
}
return 0;
}