#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct node
{
int aim[26];
int len;
};
int main()
{
int dic[101][27]={0},len,i,j;
//int aim[26]={0};
queue<node> q;
priority_queue<string,vector<string>,greater<string> > q_str;
string temp;
string strDic[101];
i=0;
while(cin>>temp && temp!="XXXXXX")
{
strDic[i]=temp;
len=temp.size();
dic[i][26]=len;
for(j=0;j<len;j++)
{
dic[i][temp[j]-'a']++;
}
i++;
}
while(cin>>temp && temp!="XXXXXX")
{
node p;
memset(p.aim,0,sizeof(p.aim));
p.len=temp.size();
for(j=0;j<p.len;j++)
{
p.aim[temp[j]-'a']++;
}
q.push(p);
}
while(!q.empty())
{
node p = q.front();
q.pop();
int n=0;
for(j=0;j<i;j++)
{
if(dic[j][26] == p.len)
{
bool flag=true;
for(int k=0;k<26;k++)
{
if(dic[j][k] != p.aim[k])
{
flag=false;
break;
}
}
if(flag)
{
//cout<<strDic[j]<<endl;
q_str.push(strDic[j]);
n++;
}
}
}
while(!q_str.empty())
{
cout<<q_str.top()<<endl;
q_str.pop();
}
if(n==0)cout<<"NOT A VALID WORD"<<endl;
cout<<"******"<<endl;
}
return 0;
}