program jiapu;
var ch:char;
st,h:string;
w,re,ww:array[0..50002]of string;
f:array[0..50000]of longint;
i,j,k,now,xw,n,m,x,y,dd:longint;
procedure kp(l,r:longint);
var i,j,k:longint;mid,t:string;
begin
i:=l;j:=r;mid:=re[(i+j)div 2];
repeat
while re[i]<mid do inc(i);
while re[j]>mid do dec(j);
if i<=j then
begin
t:=re[i];re[i]:=re[j];re[j]:=t;
inc(i);dec(j);
end;
until i>j;
if i<r then kp(i,r);
if j>l then kp(l,j);
end;
function get(x:longint):longint;
begin
if f[x]=x then exit(x);
get:=get(f[x]);
f[x]:=get;
end;
function find(x:string):longint;
var l,r,mid:longint;
begin
mid:=dd;l:=1;r:=k;
while re[mid]<>x do
begin
if re[mid]>x then r:=mid-1;
if re[mid]<x then l:=mid+1;
mid:=(l+r)div 2;
end;
find:=mid;
end;
begin
readln(w[1]);
for i:=1 to 50000 do
f[i]:=i;
i:=1;
while w[i][1]<>'?' do
begin
ww[i]:=w[i];
delete(w[i],1,1);
inc(i);
readln(w[i]);
end;
h:=w[i];
dec(i);
for j:=1 to i-1 do
for k:=j+1 to i do
if w[j]=w[k] then w[j]:=' ';
k:=0;
for j:=1 to i do
if w[j]<>' 'then
begin
inc(k);
re[k]:=w[j];
end;
kp(1,k);
dd:=(1+k)div 2;
j:=1;
while j<=i do
begin
now:=j+1;
delete(ww[j],1,1);
m:=find(ww[j]);x:=get(m);
while ww[now][1]='+' do
begin
delete(ww[now],1,1);
n:=find(ww[now]);
f[n]:=x;
inc(now);
end;
j:=now;
end;
st:=h;
while st[1]<>'$'do
begin
delete(st,1,1);
x:=f[find(st)];
writeln(st,' ',re[x]);
readln(st);
end;
end.
/**************************************************************
Problem: 2236
User: admin
Language: Pascal
Result: Wrong Answer
****************************************************************/