#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<list>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#include<string>
#define sgn(v) (abs((v))<eps?0:((v)<0?-1:1))
#define sqr(v) ((v)*(v))
#define mb make_pair
#define debug 0
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<int,LL> PIL;
typedef pair<LL,int> PLI;
typedef pair<LL,LL> PLL;
const double eps=1e-8;
const double pi=acos(-1);
const int maxn=101;
struct Point
{
	double x,y;
	Point(){}
	Point(double X,double Y)
	{
		x=X;y=Y;
	}
	bool operator <(const Point &p)const
	{
		if(sgn(x-p.x))return x<p.x;
		else return y<p.y;
	}
	bool operator ==(const Point &p)const
	{
		return sgn(x-p.x)==0&&sgn(y-p.y)==0;
	}
	Point operator -(const Point &p)
	{
		return Point(x-p.x,y-p.y);
	}
	Point operator +(const Point &p)
	{
		return Point(x+p.x,y+p.y);
	}
	double cross(const Point &p)const
	{
		return x*p.y-y*p.x;
	}
	double len()
	{
		return sqrt(sqr(x)+sqr(y));
	}
	void unit()
	{
		double tmp=len();
		x/=tmp;
		y/=tmp;
		x*=0.0001;
		y*=0.0001;
	}
}pt[maxn];
struct Segment
{
	Point st,ed;
};
double cross(const Point &p,const Point &q)
{
	return p.x*q.y-p.y*q.x;
}
double dot(const Point &p,const Point &q)
{
	return p.x*q.x+p.y*q.y;
}
Point Insect(Segment &p,Segment &q)
{
	double u=cross(p.ed-p.st,q.st-p.st),v=cross(p.st-p.ed,q.ed-p.st);
	return Point((q.st.x*v+q.ed.x*u)/(u+v),(q.st.y*v+q.ed.y*u)/(u+v));
}
vector<Point> tp,sp;
int n,cas;
int check(Point P,int deb)
{
	int con=0;
	Segment now,tmp;
	Point cp;
	now.st=P;
	con=0;
	now.ed.x=P.x+19950527;
	now.ed.y=P.y+27051995;
	for(int i=0;i<n;++i)
	{
		tmp.st=pt[i];
		tmp.ed=pt[(i+1)%n];
		if(sgn((tmp.ed-tmp.st).cross(now.ed-now.st)))
		{
			cp=Insect(tmp,now);
			if(cp==tmp.ed||cp==tmp.st)while(1);
			if(sgn(dot(tmp.ed-cp,cp-tmp.st))>0&&sgn(dot(now.ed-cp,cp-now.st))>0)
				++con;
		}
	}
	return con%2;
}
	
double check(int i,int j)
{
	Segment now,tmp;
	Point cp;
	tp.clear();
	now.st=pt[i];
	now.ed=pt[j];
	for(i=0;i<n;++i)
	{
		tmp.st=pt[i];
		tmp.ed=pt[(i+1)%n];
		if(sgn((tmp.ed-tmp.st).cross(now.ed-now.st)))
		{
			cp=Insect(tmp,now);
			if(sgn(dot(tmp.ed-cp,cp-tmp.st))>0)
				tp.push_back(cp);
			else if(sgn(dot(tmp.ed-cp,cp-tmp.st))==0) // endpoints
			{
				if(cp==tmp.st)j=i;
				else j=i+1;
				if(cross(pt[(j-1+n)%n]-now.st,now.ed-now.st)*cross(pt[(j+1)%n]-now.st,now.ed-now.st)<0)
					tp.push_back(cp);
			}
		}
		else if(sgn((tmp.st-now.st).cross(now.ed-now.st))==0&&sgn((tmp.ed-now.st).cross(now.ed-now.st))==0)
		{
			Point vec=tmp.ed-tmp.st;
			vec.unit();
			if(cross(pt[(i-1+n)%n]-now.st,now.ed-now.st)*cross(pt[(i+2)%n]-now.st,now.ed-now.st)<0)
			{
				if(!check(tmp.st-vec,0))
					tp.push_back(tmp.st);
				if(!check(tmp.ed+vec,0))
					tp.push_back(tmp.ed);
			}
		}
	}
	sort(tp.begin(),tp.end());
	int n=tp.size();
	sp.clear();
	for(i=0;i<n;++i)
		if(i==0||(!(tp[i]==tp[i-1])))sp.push_back(tp[i]);
	double ans=0;
	for(i=0;i<sp.size();i+=2)
		ans=max(ans,(sp[i+1]-sp[i]).len());
	return ans;
}
int main()
{
	int i,j;
	cas=0;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)break;
		double len=0;
		for(i=0;i<n;++i)
			scanf("%lf%lf",&pt[i].x,&pt[i].y);
		for(i=0;i<n;++i)
			len=max(len,(pt[i]-pt[(i+1)%n]).len());
		for(i=0;i<n;++i)
			for(j=i+1;j<n;++j)
				len=max(len,check(i,j));
		printf("Case %d: %.10f\n",++cas,len);
		//cout <<len*len<<endl;
	}
	return 0;
}

Measured memory_bytes: 1260