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