#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cassert>
#define N 110
#define eps 1e-8
using namespace std;

int dlcmp(double x) {return x<-eps?-1:x>eps;}
double sqr(double x) {return x*x;}

struct Point
{
	double x,y;

	Point (){}
	Point (double a,double b):x(a),y(b){}

	void input() {scanf("%lf%lf",&x,&y);}

	Point operator + (const Point &p) const {return Point(x+p.x,y+p.y);}
	Point operator - (const Point &p) const {return Point(x-p.x,y-p.y);}

	double len() {return sqrt(sqr(x)+sqr(y));}
	Point trunc(double d) {d/=len(); return Point(x*d,y*d);}
};

double cross(Point a,Point b) {return a.x*b.y-b.x*a.y;}
double dot(Point a,Point b) {return a.x*b.x+a.y*b.y;}
double dis(Point a,Point b) {return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}

Point pt[N];
vector<double>vec;
int n;

/*
// 0 in-in; 1 in-out; 2 out-in; 3 out-out
int check(Point s,Point e,Point a,Point o,Point b)
{
	Point v=e-s;

	if (dlcmp(vec,a-o)<=0&&dlcmp(vec,b-o)<=0)
		return 0;
	else if (dlcmp(vec,a-o)>0&&dlcmp(vec,b-o)>0)
		return 3;
	else if
*/

int segment_intersect(Point s1,Point e1,Point s2,Point e2)
{
	if (dlcmp(cross(e1-s1,s2-s1))*dlcmp(cross(e1-s1,e2-s1))<0&&
		dlcmp(cross(e2-s2,s1-s2))*dlcmp(cross(e2-s2,e1-s2))<0)
		return 1;
	else
		return 0;
}

Point interpoint_lines(Point s1,Point e1,Point s2,Point e2)
{
	Point v1,v2,res;

	v1=s1-e1; v2=s2-e2;

	double r=((s1.x-s2.x)*v2.y-(s1.y-s2.y)*v2.x)/(v1.x*v2.y-v2.x*v1.y);
	res.x=-r*v1.x+s1.x;
	res.y=-r*v1.y+s1.y;
	return res;
}
bool isChange(Point s,Point e,Point a,Point o,Point b)
{
	Point vec=e-s;

	if (dlcmp(cross(vec,a-s))*dlcmp(cross(vec,b-s))<0)
		return true;
	else
		return false;
}

void init()
{
	int i,cnt=0;

	cnt=2;
	for (i=2;i<n;i++)
	{
		while (cnt>1&&dlcmp(cross(pt[cnt-1]-pt[cnt-2],pt[i]-pt[cnt-1]))==0)
			cnt--;
		pt[cnt++]=pt[i];
	}
	n=cnt;
}

void solve(Point s,Point e,Point a,Point b,Point p,Point q)
{
	int dp,dq;

	dp=dlcmp(cross(e-s,p-s));
	dq=dlcmp(cross(e-s,q-s));
	if (dlcmp(dot(e-s,b-a))<0)
	{
		dp=-dp; dq=-dq;
	}


	if(dp>0&&dq>0)
	{
		vec.push_back(dis(s,a));
		vec.push_back(dis(s,b));
		//printf("put3 %.3f %.3f\n",a.x,a.y);
		//printf("put3 %.3f %.3f\n",b.x,b.y);
	}
	else if (dp>0&&dq<0)
	{
		vec.push_back(dis(s,a));
		//printf("put3 %.3f %.3f\n",a.x,a.y);
	}
	else if (dp<0&&dq>0)
	{
		vec.push_back(dis(s,b));
		//printf("put3 %.3f %.3f\n",b.x,b.y);
	}
}


int main()
{
	int i,j,k,m;
	double ans,tmp;
	Point s,e,a,b,o,aa,bb;

	int ys=0;

	while(scanf("%d",&n),n)
	{
		for (i=0;i<n;i++)
			pt[i].input();

		init();
		//printf("n %d\n",n);
		//for (i=0;i<n;i++)
			//printf("%.2f %.2f\n",pt[i].x,pt[i].y);

		ans=0;
		for (i=0;i<n;i++)
			for (j=0;j<n;j++)
			{
				if (i==j) continue;
				//printf("i%d j%d\n",i,j);
				s=pt[i]+(pt[i]-pt[j]).trunc(5000); e=pt[j]+(pt[j]-pt[i]).trunc(5000);

				vec.clear();
				for (k=0;k<n;k++)
				{
					a=pt[k]; b=pt[(k+1)%n];

					if (segment_intersect(s,e,a,b))
					{
						Point p=interpoint_lines(s,e,a,b);
						//printf("put1 %.3f %.3f\n",p.x,p.y);
						vec.push_back(dis(s,p));
					}
				}

				for (k=0;k<n;k++)
				{
					o=pt[k]; a=pt[(k-1+n)%n]; b=pt[(k+1)%n];

					if (dlcmp(cross(e-s,o-s))==0&&isChange(s,e,a,o,b))
					{
						//printf("put2 %.3f %.3f %.3f\n",o.x,o.y,dis(s,o));
						vec.push_back(dis(s,o));
					}
				}

				for (k=0;k<n;k++)
				{
					a=pt[k]; b=pt[(k+1)%n],aa=pt[(k-1+n)%n]; bb=pt[(k+2)%n];

					if (dlcmp(cross(e-s,a-s))==0&&dlcmp(cross(e-s,b-s))==0)
					{
						Point f1=e-s, f2=b-a;
						//printf("true k %d %.3f %.3f %.3f %.3f\n",k,f1.x,f1.y,f2.x,f2.y);
						solve(s,e,a,b,aa,bb);
					}
				}

				sort(vec.begin(),vec.end());
				m=vec.size(); assert(m%2==0);
				tmp=0;
				for (k=0;k<m;k+=2)
					tmp=max(tmp,vec[k+1]-vec[k]);

				ans=max(ans,tmp);
			}

		printf("Case %d: %.8f\n",++ys,ans);
	}

	return 0;
}

Measured memory_bytes: 1116