#include<bits/stdc++.h>
using namespace std;
bool check[500005];
vector<int> ans[500005];
vector<int> G[500005];
stack<int> sta;
int bcc;
int n,dfn[500005],low[500005],cnt;
unsigned long long ans1,ans2;
void dfs(int u,int fa){
dfn[u]=low[u]==++cnt;
sta.push(u);
int ch=0;
for(auto v:G[u]){
if(v==fa) continue;
if(dfn[v]){
low[u]=min(low[u],dfn[v]);
}
else{
dfs(v,u);
++ch;
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
bcc++;
if(fa!=0) check[u]=1;
while(sta.top()!=v){
ans[bcc].push_back(sta.top());
sta.pop();
}
ans[bcc].push_back(v);
sta.pop();
ans[bcc].push_back(u);
}
}
}
if(fa==0&&G[u].size()==0){
ans[++bcc].push_back(u);
}
if(fa==0&&ch>=2) check[u]=1;
return;
}
void init(){
for(int i=1;i<=1000;i++) G[i].clear(),ans[i].clear();
for(int i=1;i<=1000;i++) check[i]=dfn[i]=low[i]=0;
bcc=cnt=0;
ans1=0;
ans2=1;
while(!sta.empty()) sta.pop();
}
void solve(){
init();
for(int i=1;i<=n;i++){
int u,v;
cin>>u>>v;
if(u==v) continue;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=1000;i++){
if(!dfn[i]&&G[i].size()){
while(!sta.empty()) sta.pop();
dfs(i,0);
}
}
for(int i=1;i<=bcc;i++){
unsigned long long u=ans[i].size();
int q=0;
for(auto ch : ans[i]) if(check[ch]==1) ++q;
if(q==0){
ans1+=2;
ans2*=u*(u-1)/2;
}
else if(q==1){
ans1++;
ans2*=(u-1);
}
}
}
int main(){
for(int i=1;;i++){
cin>>n;
if(n==0) break;solve();
cout<<"Case "<<i<<": "<<ans1<<" "<<ans2<<"\n";
}
return 0;
}