#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=1e3+10,M=1e3+10;
int n,m;
int cnt,head[N];
struct Edge{int nxt,to;}e[N<<1];
inline void add(int u,int v)
{
e[++cnt]=(Edge){head[u],v};
head[u]=cnt;
}
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
return x*f;
}
int T,st[N],BCC,root,dfntime,block[N][M],dfn[N],low[N],top,cut[N];
inline void tarjan(int u)
{
dfn[u]=low[u]=++dfntime;
st[++top]=u;
int cc=0;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
if((u==root&&cnt>1)||(u!=root&&dfn[u]<=low[v])) cut[u]=1;
if(dfn[u]<=low[v])
{
++BCC;
block[BCC][0]=0;
do
{
block[BCC][++block[BCC][0]]=st[top--];
}while(st[top+1]!=v);
block[BCC][++block[BCC][0]]=u;
}
}
else low[u]=min(low[u],dfn[v]);
}
}
ll ans,sum;
signed main()
{
while(scanf("%d",&m)&&m)
{
n=0;
for(int i=1;i<=m<<1;i++)
dfn[i]=low[i]=head[i]=0;
cnt=top=dfntime=0;
while(m--)
{
int u=read(),v=read();
n=max(n,max(u,v));
add(u,v),add(v,u);
}
BCC=0;
for(int i=1;i<=n;i++) cut[i]=0;
for(int i=1;i<=n;i++)
if(!dfn[i])
{
root=i;
tarjan(root);
}
ans=0,sum=1;
for(int i=1;i<=BCC;i++)
{
int l=block[i][0],gsum=0;
for(int j=1;j<=l;j++)
{
if(cut[block[i][j]]) gsum++;
}
if(gsum==0) ans+=2,sum*=l*(l-1)/2;
else if(gsum==1) ans+=1,sum*=(l-1);
}
printf("Case %d: %lld %lld\n",++T,ans,sum);
}
return 0;
}