luoguAC,uvaTLE
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500005;
#define int long long
int dfn[maxn], low[maxn];
vector <int> g[maxn];
bool vis[maxn];
bool vis2[maxn];
int cut[maxn];
int t, sccnum;
int root;
inline int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x) {
if (x < 0) {
x = ~(x - 1);
putchar('-');
}
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void tarjan(int u){
dfn[u] = low[u] = ++t;
int flag = 0;
for(int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]){
flag++;
if(u != root or flag > 1) cut[u] = 1;
}
}
else low[u] = min(low[u], dfn[v]);
}
}
bool iscut(int u){
if(cut[u]) return 1;
vis[u] = 1;
bool f = false;
for(int v = 0; v < g[u].size(); v++){
if(!vis[g[u][v]]) {
if(iscut(g[u][v])) f = true;
}
}
return f;
}
int dfs(int u){
int cnt = 1;
vis2[u] = 1;
for(int v = 0; v < g[u].size(); v++){
if(!vis2[g[u][v]]) cnt += dfs(g[u][v]);
}
return cnt;
}
signed main(){
int ttt = 0;
while(1){
int n = read();
// cin>>n;
if(n == 0) break;
int MAXN = -1;
int m = n;
for(int i = 1; i <= m; i++){
int u = read(), v = read();
// cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
MAXN = max(MAXN, max(u, v));
}
for(int i = 1; i <= n; i++){
if(!dfn[i]) root = i, tarjan(i);
}
int ret = 0;
long long ans = 1;
int ans2 = 0;
bool f = true;
for(int i = 1; i <= n; i++){
if(cut[i]){
memset(vis, 0, sizeof(vis));
memset(vis2, 0, sizeof(vis2));
f = 0;
for(int j = 0; j < g[i].size(); j++){
vis[i] = 1;
if(!iscut(g[i][j])){
vis2[i] = 1;
if(!vis2[g[i][j]]) ans2 += 1;
ans *= dfs(g[i][j]);
}
}
}
}
printf("Case %lld: ", ++ttt);
// puts(": ") ;
// cout<<"Case "<<++ttt<<": ";
for(int i = 1; i <= n; i++){
g[i].clear();
}
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(cut, 0, sizeof(cut));
memset(vis, 0, sizeof(vis));
memset(vis2, 0, sizeof(vis2));
t = 0, sccnum = 0, root = 0;
if(f){
printf("2 %lld\n", (MAXN-1)*MAXN/2);
// cout<<2<<' '<<<<endl;
continue;
}
printf("%lld %lld\n", ans2, ans);
// cout<<ans2<<' '<<ans<<endl;
}
return 0;
}