/*
Name: 最短路(bellmanFord)
Copyright:
Author: Try86
Date: 18/04/12 13:50
Description: 判断是否从某一种货币出发经过一系列的转换后回到自身时,货币币值增加
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
const int N = 35;
const int M = 1000;
double d[N];
char names[N][N], str1[N], str2[N];
struct edge {
int u;
int v;
double w;
}e[M];
int cmp(const void *a, const void *b) {
return strcmp((char *)a, (char *)b);
}
int binarySearch(char *str, int n) {
int left = 0;
int right = n;
while (left <= right) {
int mid = (left + right) / 2;
if (!strcmp(names[mid], str)) return mid;
else if (strcmp(names[mid], str) > 0) right = mid - 1;
else left = mid + 1;
}
}
void relax(int u, int v, double w) {//松弛,权值相乘
if (d[v] < d[u]*w) d[v] = d[u] * w;
return ;
}
bool bellmanFord(int m, int n, int s) {
memset(d, 0, sizeof(d));//初始化
d[s] = 1;
for (int i=0; i<n; ++i) {
for (int j=0; j<m; ++j) {
relax(e[j].u, e[j].v, e[j].w);
}
}
return d[s] > 1.0;//判断转换后币值是否增加
}
int main() {
int n, t = 0;
double w;
while (scanf("%d", &n), n) {
for (int i=0; i<n; ++i) scanf ("%s", names[i]);
qsort(names, n, sizeof(names[0]), cmp);
int m;
scanf ("%d", &m);
for (int i=0; i<m; ++i) {
scanf ("%s%lf%s", str1, &w, str2);
int u = binarySearch(str1, n);
int v = binarySearch(str2, n);
e[i].u = u, e[i].v = v, e[i].w = w;
}
bool flag;
for (int i=0; i<n; ++i) {//以每种货币为源点,进行最短路操作
flag = bellmanFord(m, n, i);
if (flag) break;//存在符合条件的货币,退出
}
if (flag) printf ("Case %d: Yes\n", ++t);
else printf ("Case %d: No\n", ++t);
}
return 0;
}