#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1005;
vector<int> g[maxn];
int flag[maxn],dfn[maxn],low[maxn],timer;
void tj(int x,int fa)
{
dfn[x]=low[x]=++timer;
int c=0;
for(auto to:g[x])
{
if(!dfn[to])
{
c++;
tj(to,x);
low[x]=min(low[x],low[to]);
if(low[to]>=dfn[x]) flag[x]=1;
}
else if(to!=fa)
{
low[x]=min(low[x],dfn[to]);
}
}
if(x==fa&&c<2) flag[x]=0;
}
int kk,k,vis[maxn];
set<int> s;
void dfs(int x)
{
vis[x]=1;
k++;
for(auto to:g[x])
{
if(!vis[to])
{
if(flag[to]) s.insert(to);
else dfs(to);
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int m;
int t=0;
while(cin>>m&&m)
{
memset(flag,0,sizeof(flag));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
timer=0;
for(int i=0;i<maxn;i++) g[i].clear();
t++;
int n=0;
for(int i=1;i<=m;i++)
{
int u,v;cin>>u>>v;
n=max({u,v,n});
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tj(i,-1);
int sum=1,ans=0;
for(int i=1;i<=n;i++)
{
if(!flag[i]&&!vis[i])
{
s.clear();
kk=0;
k=0;
dfs(i);
kk=s.size();
if(kk==1)
{
ans++;
sum*=k;
}
if(!kk)
{
ans+=2;
sum*=k*(k-1)/2;
}
}
}
cout<<"Case "<<t<<": "<<ans<<' '<<sum<<endl;
}
return 0;
}