#include<iostream>
#include<string>
#include<map>
#include<tuple>
#include<vector>
#include<set>

using namespace std;

struct edge{
  int v,f;
};

map<string,int> m;
vector<edge> G[2000];

int num(string s){
  if(!m.count(s)){
    auto n=m.size();
    m[s]=n;
    G[n].clear();
  }
  return m[s];
}

tuple<int,int> input(){
  string s;
  cin>>s;
  int h=s.find('-');
  int x=num(s.substr(0,h));
  int y=num(s.substr(h+1));
  return make_tuple(x,y);
}

bool dfs(int x,int y,int f,set<int> &s){
  if(x==y)return f;
  if(!s.insert(x).second)return false;
  for(auto e:G[x]){
    if(dfs(e.v,y,f^e.f,s))return true;
  }
  return false;
}

int main(){
  for(int N;cin>>N,N;){
    m.clear();
    bool d[200][200]={};
    for(int i=0;i<N;i++){
      int x,y;
      tie(x,y)=input();
      G[y].push_back({x,1});
      d[y][x]=true;
    }
    for(int i=0;i<200;i++){
      for(int j=0;j<i;j++){
	bool s=false,df=false;
	for(int k=0;k<200;k++){
	  s|=d[i][k]&&d[j][k]||d[k][i]&&d[k][j];
	  df|=d[i][k]&&d[k][j]||d[j][k]&&d[k][i];
	}
	if(s&&!df){
	  G[j].push_back({i,0});
	  G[i].push_back({j,0});
	}
      }
    }
    cout<<m.size()<<endl;
    int M;
    cin>>M;
    while(M--){
      int x,y;
      tie(x,y)=input();
      set<int> s;
      cout<<(dfs(y,x,0,s)?"YES":"NO")<<endl;
    }
  }
}