#include <bits/stdc++.h>
using namespace std;
int const N = 100 * 1000 + 16;
int const inf = 1000 * 1000 * 1000;
int n, m, k;
char w[32], z[32];
int fa[N];
int op[N];
int find(int x) { return fa[x] ? fa[x] = find(fa[x]) : x; }
int main() {
  scanf("%d%d%d", &n, &m, &k);
  unordered_map<string, int> idx;
  idx.max_load_factor(0.35f);
  idx.reserve(4 * n);
  for (int i = 1; i <= n; ++i) {
    scanf(" %s", w);
    idx[w] = i;
  }
  while (m--) {
    int t;
    scanf("%d %s %s", &t, w, z);
    int u = find(idx[w]);
    int v = find(idx[z]);
    bool can = true;
    op[u] = find(op[u]);
    op[v] = find(op[v]);
    if (t == 1) {
      if (u == v) {
        puts("YES");
        continue;
      }
      if ((op[v] && u == op[v]) || (op[u] && op[u] == v)) can = false;
      if (can) {
        fa[v] = u;
        if (op[u] && op[v])
          fa[op[v]] = op[u];
        else if (not op[u])
          op[u] = op[v];
      }
    } else {
      if (u == v || (op[u] == op[v] && op[v])) {
        puts("NO");
        continue;
      }
      if (op[u] && v != op[u])
        fa[op[u]] = v;
      else
        op[u] = v;
      if (op[v] && u != op[v])
        fa[op[v]] = u;
      else
        op[v] = u;
    }
    puts(can ? "YES" : "NO");
  }
  while (k--) {
    scanf(" %s %s", w, z);
    int u = find(idx[w]);
    int v = find(idx[z]);
    op[u] = find(op[u]);
    op[v] = find(op[v]);
    int ans = 3;
    if (u == v)
      ans = 1;
    else if (op[u] == v || u == op[v])
      ans = 2;
    printf("%d\n", ans);
  }
}
