#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 50010
struct node{
char name[10];
}A[maxn];
int n;
int f[maxn];
int hash_val(char str[]){
int i;
for(i = 1;i <= n; i++){
if(strcmp(str,A[i].name)==0)return i;
}
return 0;
}
int find(int v){
if(f[v]==v)return v;
int F = find(f[v]);
f[v] = F;
return F;
}
int main()
{
n = 0;
char temp[10];
int last;
for(int i = 1;i <= 50001; i++){
f[i] = i;
}
while(scanf("%s",temp) && strcmp(temp,"$") != 0){
char str[10];
strcpy(str,&temp[1]);
int index = hash_val(str);
if(temp[0]=='#'){
if(!index){
strcpy(A[++n].name,str);
last = n;
}
else{
last = index;
}
}
if(temp[0]=='+'){
int now;
if(!index){
strcpy(A[++n].name,str);
now = n;
}
else{
now = index;
}
int fa = find(last);
int fb = find(now);
f[fb] = fa;
}
if(temp[0]=='?'){
int v = hash_val(str);
int fv = find(v);
printf("%s %s\n",str,A[fv].name);
}
}
return 0;
}
/**************************************************************
Problem: 2236
User: admin
Language: C
Result: Accepted
Time:685 ms
Memory:1828 kb
****************************************************************/