#include <bits/stdc++.h>
using namespace std;

using Pair = pair<int, int>;

int N;
int M;
int g_idx;
char buf[114514];
int par[4145];
int myrank[4145];
bool used[4145];
bool isr[4145][4145];
bool isr2[4145][4145];

vector<int> vs[4145];
vector<int> es[4145];
vector<int> res[4145];
vector<int> bs[4145];
map<string, int> mp;

int root(int v) {
  if (par[v] == v) return v;
  return par[v] = root(par[v]);
}

void unite(int a, int b) {
  a = root(a);
  b = root(b);
  if (a == b) return;
  if (myrank[a] < myrank[b]) par[a] = b;
  else if (myrank[b] < myrank[a]) par[b] = a;
  else {
    par[a] = b;
    myrank[a]++;
  }
}


Pair GetIdx(string &s) {
  auto itr = s.find('-');
  string a;
  a.assign(s, 0, itr);
  string b;
  b.assign(s, itr+1, s.size()-itr-1);
  if (!mp.count(a)) mp[a] = g_idx++;
  if (!mp.count(b)) mp[b] = g_idx++;
  return Pair(mp[a], mp[b]);
}

void dfs1(int v, int k) {
  isr[k][v] = true;
  for (int u : es[v]) {
    if (isr[k][u]) continue;
    dfs1(u, k);
  }
}

void dfs2(int v, int k) {
  for (int dv : vs[root(v)]) {
    if (isr2[k][dv]) return;
  }

  for (int dv : vs[root(v)]) {
    isr2[k][dv] = true;
    for (int u : es[dv]) {
      if (isr2[k][u]) continue;
      dfs2(u, k);
    }
  }
}

int dfs3(int v, int k) {
  if (used[v]) return -1;
  if (v == k) return 0;
  used[v] = true;

  int ret = -1;
  for (int u : bs[v]) {
    ret = max(ret, dfs3(u, k));
  }
  if (ret == -1) return -1;
  //printf("%d %d: %d\n", v, k, ret);
  return ret+1;
}

int main() {
  while (1) {
    scanf("%d", &N);
    if (N == 0) return 0;

    mp.clear();
    g_idx = 0;
    for (int i=0; i<N; i++) {
      scanf("%s", buf);
      string s = buf;
      int a, b;
      tie(a, b) = GetIdx(s);
      bs[a].emplace_back(b);
      bs[b].emplace_back(a);
      es[a].emplace_back(b);
      res[b].emplace_back(a);
    }
    printf("%d\n", g_idx);

    for (int i=0; i<g_idx; i++) {
      par[i] = i;
      myrank[i] = 0;
      for (int j=0; j<g_idx; j++) {
        isr[i][j] = false;
        isr2[i][j] = false;
      }
    }

    for (int i=0; i<g_idx; i++) {
      dfs1(i, i);
    }

    for (int i=0; i<g_idx; i++) {
      for (int u : es[i]) {
        for (int v : es[i]) {
          if (!isr[u][v] && !isr[v][u]) unite(u, v);
        }
      }

      for (int u : res[i]) {
        for (int v : res[i]) {
          if (!isr[u][v] && !isr[v][u]) unite(u, v);
        }
      }
    }

    for (int i=0; i<g_idx; i++) {
      vs[root(i)].emplace_back(i);
    }

    for (int i=0; i<g_idx; i++) {
      dfs2(i, i);
    }
    
    scanf("%d", &M);
    for (int i=0; i<M; i++) {
      scanf("%s", buf);
      string s = buf;
      int a, b;
      tie(a, b) = GetIdx(s);
      //for (int i=0; i<g_idx; i++) used[i] = false;
      //printf("%d %d : %d\n", a, b, dfs3(a, b));
      for (int i=0; i<g_idx; i++) used[i] = false;
      if (isr2[a][b] && dfs3(a, b)%2 == 1) puts("YES");
      else puts("NO");
    }

    for (int i=0; i<g_idx; i++) {
      es[i].clear();
      res[i].clear();
      bs[i].clear();
      vs[i].clear();
    }
  }
}