#include<bits/stdc++.h>
using namespace std;
const int N = 210, M = 2 * N;
int color[N];
int h[N], e[M], ne[M], idx;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
//邻接表模版 int h[N],e[M],ne[M],idx; 对于add函数,无向图记得要add(a,b) add(b,a)两次 add(a,b) e[idx]=b,ne[idx]=h[a],h[a]=cnt++;
map<string, int> d;
//map<string,int>用于离散化,if(d.count(a)) d[a]=++cnt; cnt初始化为0
bool dfs(int a, int c) {
color[a] = c;
for (int i = h[a];i != -1;i = ne[i]) {
//int i=h[a] a为一端 i!=-1 i=ne[i] i始终都为编号,ne里面存着下一条边的编号
int id = e[i];
//记得要取e里面的数值,这个才是边的另一端
if (!color[id]) {
if (!dfs(id, 3 - c)) {
return false;
}
//对于递归的结果也要进行考虑返回
}
else {
if (c == color[id]) {
return false;
}
}
}
return true;
}
void init() {
memset(color, 0, sizeof color);
//color也要初始化为0
memset(h, -1, sizeof h);
//这个必须要初始化为-1
idx = 0;
//重新编号
d.clear();
//离散化清理
}
int main()
{
int t;cin >> t;
for (int id = 1;id <= t;id++) {
init();
int m;cin >> m;
int cnt = 0;
//从1开始编号,最终有cnt个顶点(离散化不重复的顶点)
for (int i = 0;i < m;i++) {
string a, b;cin >> a >> b;
if (!d.count(a)) d[a] = ++cnt;
if (!d.count(b)) d[b] = ++cnt;
add(d[a], d[b]); add(d[b], d[a]);
}
bool flag=true;
for (int i = 1;i <= cnt;i++) {
if (color[i] == 0) {
flag=dfs(i, 1);
if (flag == false)
break;
}
}
if (flag)
cout << "Case #" << id << ": Yes" << endl;
else
cout << "Case #" << id << ": No" << endl;
}
return 0;
}