/*
分析:
最短路径,不过这里是乘法、求最大。
注意,因为是乘法,乘数可以大于1、也可以小于1,就等效于边的权值都
是整数的最短路里面,每条边的权值可以有正数、也可以有负数一样。
所以果断不用Dij。第一次写Floyd,一次过哦~
2012-06-05
*/
#include"stdio.h"
#include"string.h"
struct A
{
char name[33];
}E[33];
int main()
{
double map[31][31];
double ans[31][31];
double t;
char temp[33];
int k;
int k1,k2;
int i,l;
int n,m;
int Case=1;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++) scanf("%s",E[i].name);
///map
scanf("%d",&m);
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
{
if(i==l)map[i][l]=1;
else map[i][l]=0;
}
for(i=1;i<=m;i++)
{
scanf("%s",temp);
for(k1=1;k1<=n;k1++) if(strcmp(E[k1].name,temp)==0) break;
scanf("%lf",&t);
scanf("%s",temp);
for(k2=1;k2<=n;k2++) if(strcmp(E[k2].name,temp)==0) break;
map[k1][k2]=t;
}
///ans的初始化
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
ans[i][l]=map[i][l];
///主体
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
{
if(ans[i][l]<ans[i][k]*ans[k][l])
ans[i][l]=ans[i][k]*ans[k][l];
}
}
if(ans[1][1]>1) printf("Case %d: Yes\n",Case);
else printf("Case %d: No\n",Case);
Case++;
}
return 0;
}