def inputWords(dct):													# Bemenetet ker es atalakit 							(definialas)
	data = input().split(" ")
	dct[data[0]] = int(data[1])
def convert(string):													# String-et alakit dict-e 								(definialas)
	dct = {}
	for i in string:
		if i in dct: dct[i] += 1
		else: dct[i] = 1
	return dct
def substractable(str1,str2):											# Ellenorzi ki lehet-e vonni a ket string-et egymasbol	(definialas)
	dct1,dct2 = convert(str1),convert(str2)
	for i in dct2:
		if i not in dct1: return False
		elif dct1[i] < dct2[i]: return False
	return True
def substract(str1,str2):												# Kivon ket string-et egymasbol 						(definialas)
	lst1,lst2 = list(str1),list(str2)
	for i in lst2:
		lst1.remove(i)
	return "".join(lst1)
def printAnswer(dct):													# ABC sorrendben irja ki az egy betubol allo szavakat 	(definialas)
	alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
	for l in alphabet:
		if l in data:
			print(l,data[l])

data,new = {},{}														# Valtozokat hoz letre
for i in range(int(input())): inputWords(data)							# N-szer bemenetet ker
while True:											
	new = {}
	for k1 in data:
		for k2 in data:
			if k1 == k2: pass											# Ket megegyezo string-et nem von ki egymasbol
			elif substractable(k1,k2):									# Ellenorzi, hogy a kivonast el lehet-e vegezni
				if substract(k1,k2) not in data:						# Ellenorzi hogy nincs meg a szo
					new[substract(k1,k2)] = data[k1]-data[k2]			# Uj eredmeny syamit es hoz letre
	if new == {}: break													# Ha nincs uj eredmeny, megszakitja a ciklust
	data.update(new)													# Frissiti az adatokat az uj eredmenyekkel
printAnswer(data)														# A megoldas kiirja
