#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;

struct Node{
    string name;
    vector<int> edge,rev,eq;
    int col;
};

std::vector<string> splitAll(string s,string t){
  std::vector<string> v;
  for(int p=0; (p = s.find(t)) != s.npos; ){
    v.push_back(s.substr(0,p));
    s=s.substr(p+t.size());
  }
  v.push_back(s);
  return v;
}

void dfs(vector<Node> &g,int v,int use,bool col) {
    if(g[v].col != -1) return;
    g[v].col = use - (col?1:0);
    for(int i=0; i<g[v].edge.size(); ++i)
        dfs(g,g[v].edge[i], use, !col);

    for(int i=0; i<g[v].rev.size(); ++i)
        dfs(g,g[v].rev[i], use, !col);

    return;
}

int dist[201][201];

void make_graph(vector<Node> &g) {
    for(int i=0; i<g.size(); ++i)
        for(int j=i+1; j<g.size(); ++j) {
            bool ok = false;
            for(int k=0; k<g.size(); ++k) {
                int c1 = count(g[i].edge.begin(), g[i].edge.end(), k);
                int c2 = count(g[i].rev.begin(), g[i].rev.end(), k);
                int d1 = count(g[j].edge.begin(), g[j].edge.end(), k);
                int d2 = count(g[j].rev.begin(), g[j].rev.end(), k);
                if((c1 > 0 && d2 > 0) || (c2 > 0 && d1 > 0)) goto NEXT;
                if((c1 > 0 && d1 > 0) || (c2 > 0 && d2 > 0)) ok = true;
            }
            if(ok) g[i].eq.push_back(j),g[j].eq.push_back(i);
        NEXT:;
        }

    for(int i=0; i<201; ++i) for(int j=0; j<201; ++j) dist[i][j] = 1<<29;
    for(int i=0; i<g.size(); ++i) dist[i][i] = 0;
    for(int i=0; i<g.size(); ++i) {
        for(int j=0; j<g[i].eq.size(); ++j)
            dist[i][g[i].eq[j]] = dist[g[i].eq[j]][i] = 0;
        for(int j=0; j<g[i].edge.size(); ++j)
            dist[i][g[i].edge[j]] = 1;
    }

    for(int k=0; k<g.size(); ++k)
        for(int i=0; i<g.size(); ++i)
            for(int j=0; j<g.size(); ++j)
                dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]);
}

void coloring(vector<Node> &g) {
    int use = -1;
    for(int i=0; i<g.size(); ++i) {
        if(g[i].col != -1) continue;
        use += 2;
        dfs(g, i, use, true);
    }
}

bool seen[205];

bool dfs2(vector<Node> &g,int v,int target) {
    if(v == target) return true;
    seen[v] = true;
    for(int i=0; i<g[v].edge.size(); ++i) {
        if(seen[g[v].edge[i]]) continue;
        if(dfs2(g, g[v].edge[i], target)) return true;
    }
    return false;
}

int main() {
    int n,m;
    string in;
    while(cin>>n) {
        if(n == 0) break;
        map<string, int> idx;
        vector<Node> g;
        for(int i=0; i<n; ++i) {
            cin>>in;
            vector<string> vs = splitAll(in, "-");
            string name1 = vs[0],name2 = vs[1];
            if(idx.find(name1) == idx.end()) {
                idx[name1] = g.size();
                Node no; no.name = name1; no.col = -1;
                g.push_back(no);
            }
            if(idx.find(name2) == idx.end()) {
                idx[name2] = g.size();
                Node no; no.name = name2; no.col = -1;
                g.push_back(no);
            }
            g[idx[name1]].edge.push_back(idx[name2]);
            g[idx[name2]].rev.push_back(idx[name1]);
        }

        make_graph(g);
        cout<<g.size()<<endl;
        // for(int i=0; i<g.size(); ++i)
        //     cout<<i<<" : "<<g[i].name<<endl;

        cin>>m;
        for(int i=0; i<m; ++i) {
            cin>>in;
            vector<string> vs = splitAll(in, "-");
            string name1 = vs[0], name2 = vs[1];
            if(idx.find(name1) == idx.end() || idx.find(name2) == idx.end()) {
                cout<<"NO"<<endl;
                continue;
            }

//            cout<<dist[idx[name1]][idx[name2]]<<endl;
            if(dist[idx[name1]][idx[name2]] <= 200
               && dist[idx[name1]][idx[name2]]%2) {
                cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
    }
}

Measured memory_bytes: 1148