#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

#define NMAX 50002

struct tagPerson
{
	char m_name[7];
	int m_father;
} Person[NMAX];

int g_nPeople = 0;

void InitData();
int FindAncestor(const char szName[]);
int AddPerson(const char szName[]);
int CheckPerson(const char szName[]);

int main()
{
	InitData();
	return 0;
}

void InitData()
{
	char szName[8] = "\0";
	int nFather = 0;
	char chFlag = '\0';

	cin >>szName;
	chFlag = szName[0];
	while (chFlag != '$')
	{
		if (chFlag == '#')
		{
			nFather = FindAncestor(szName + 1);
			cin >>szName;
			chFlag = szName[0];
			while (chFlag == '+')
			{
				int father = CheckPerson(szName + 1);
				if (father == -1)
				{
					father = AddPerson(szName + 1);
				}

				Person[father].m_father = nFather;

				cin >>szName;
				chFlag = szName[0];
			}
		}
		
		if (chFlag == '?')
		{
			nFather = FindAncestor(szName + 1);
			cout <<szName+1 <<' ' <<Person[nFather].m_name <<endl;
			
			cin >>szName;
			chFlag = szName[0];
		}
	}
}

int FindAncestor(const char szName[])
{
	int nFather = CheckPerson(szName);

	if (nFather == -1)
	{
		nFather = AddPerson(szName);
	}
	else
	{
		while (Person[nFather].m_father != nFather)
		{
			nFather = Person[nFather].m_father;
		}
	}
	
	return nFather;
}

int AddPerson(const char szName[])
{
	Person[g_nPeople].m_father = g_nPeople;
	strcpy(Person[g_nPeople].m_name, szName);
	++g_nPeople;
	
	return g_nPeople - 1;
}

int CheckPerson(const char szName[])
{
	for (int i = 0; i < g_nPeople; ++i)
	{
		if (strcmp(szName, Person[i].m_name) == 0)
		{
			return i;
		}
	}
	return -1;
}
/**************************************************************
	Problem: 2236
	User: admin
	Language: C++
	Result: Accepted
	Time:676 ms
	Memory:2664 kb
****************************************************************/