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
****************************************************************/