#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

struct node{
   int right,child;
   char ch;
   bool end;
}tree[350010];

int index = 1,cnt = 0,mat[100],tl[100];
char answer[128],key[125],list[100][30];
bool used[128],findans,matched[100];

void insert(int p,char *word){
   if (tree[p].ch){
       if (tree[p].ch == *word){
           if (!*(word + 1)) tree[p].end = 1;
           else{
               if(!tree[p].child) tree[p].child = ++index;
               insert(tree[p].child,word + 1);
           }
       }
       else{
           if (tree[p].right) insert(tree[p].right,word);
           else {
               tree[p].right = ++ index;
               insert(tree[p].right,word);
           }
       }
   }
   else{
       tree[p].ch = *word;
       if (!*(word + 1)) tree[p].end = 1;
       else{
           tree[p].child = ++ index;
           insert(tree[p].child,word + 1);
       }
   }
}

int findwordmat(){
   for (int i = 0;i < cnt;i ++){
       mat[i] = 0;
       for (int j = 0;j < tl[i];j ++)
           if (key[list[i][j]])
               ++ mat[i];
   }
}

int subsearch(int cur,int wi,int num,int tnum);
int search(int cur){
   if (cur == cnt){
       if (findans) return 2;
       findans = 1;
       for (int i = 'A';i <= 'Z';i ++) answer[key[i]] = i;
       return 1;
   }
   findwordmat();
   int m = -1,wi;
   for (int i = 0;i < cnt;i ++)
       if (!matched[i] && mat[i] > m){
           m = mat[i];
           wi = i;
       }
   return subsearch(cur,wi,0,1);
}

int subsearch(int cur,int wi,int num,int tnum){
   if (num == tl[wi]){
       matched[wi] = true;
       int tmp = search(cur + 1);
       matched[wi] = false;
       return tmp;
   }
   if (!tnum) return 0;
   char cc = list[wi][num];
   if (key[cc]){
       for (;tnum;tnum = tree[tnum].right)
           if (tree[tnum].ch == key[cc]){
               if (num + 1 == tl[wi] && !tree[tnum].end) return 0;
               return subsearch(cur,wi,num + 1,tree[tnum].child);
           }
       return 0;
   }else{
       int find = 0;
       for (;tnum;tnum = tree[tnum].right)
           if (!used[tree[tnum].ch]){
               if (num + 1 == tl[wi] && !tree[tnum].end) continue;
               used[tree[tnum].ch] = true;
               key[cc] = tree[tnum].ch;
               int tmp = subsearch(cur,wi,num + 1,tree[tnum].child);
               key[cc] = 0;
               used[tree[tnum].ch] = false;
               if (tmp == 2) return tmp;
               if (tmp == 1) find = tmp;
           }
       return find;
   }
}

int main(){

   char word[130];
   int w,t,tmp,pd,T;
   scanf("%d",&w);
   for (int i = 1;i <= w;i ++){
       scanf("%s",word);
       insert(1,word);
   }
   scanf("%d",&T);
   while (T --){
       memset(list,0,sizeof list);
       cnt = 0,tmp = 0,pd = 0;
       findans = 0;
       memset(key,0,sizeof key);
       memset(answer,0,sizeof answer);
       char c;
       while (c = getchar(),c < 'A' || c > 'z');
       for (;;){
           if (c >= 'A' && c <= 'Z'){
               pd = false; list[cnt][tmp ++] = c;
           }
           else if (c == ' '){
               pd = false;
               if (tmp){
                   tl[cnt] = tmp;list[cnt ++][tmp] = 0;
                   tmp = 0;
               }
           }
           else if (c == '\n'){
               if (tmp){
                   tl[cnt] = tmp;list[cnt ++][tmp] = 0;
                   tmp = 0;
               }
               if (pd) break;
               pd = 1;
           }
           if (scanf("%c",&c) == EOF){
               if (tmp){
                   tl[cnt] = tmp;list[cnt ++][tmp] = 0;
                   tmp = 0;break;
               }
           }
       }
       int tmp = search(0);
       if (tmp == 0) puts("#No solution#");
       else if (tmp == 1){
           for (int i = 'A';i <= 'Z';i ++){
               if (answer[i]) printf("%c",answer[i]);
               else printf("*");
           }
           printf("\n");
       }else{
           puts("#More than one solution#");
       }        
   }
   return 0;
}