#include <iostream>
	#include <vector>
	#include <cctype>
	#include <map>
	#include <stack>

	struct Molecule
	{
		std::string name;
		int count;

		Molecule() : name(""), count(1) {}
		Molecule(const std::string& name) : name(name), count(1) {}
		Molecule(const std::string& name, int count) : name(name), count(count) {}
	};
	std::stack<Molecule> parseInput(const std::string& line);

	int main()
	{
		std::string line;
		while(getline(std::cin, line))
		{
			std::cout << line << std::endl;
			auto stack = parseInput(line);
			std::map<std::string, int> moleculeCount;
			while(!stack.empty())
			{
				auto molecule = stack.top();
				stack.pop();
				moleculeCount[molecule.name] += molecule.count;
			}

			for(const auto& kv: moleculeCount)
				std::cout << kv.first << " : " << kv.second << std::endl;
			std::cout << std::endl;
		}
		return 0;
	}

	std::stack<Molecule> parseInput(const std::string& line)
	{
		std::stack<Molecule> stack;
		size_t i = 0;
		while(i < line.length() - 1)
		{
			char curr = line[i];
			char next = line[i + 1];
			if(std::isupper(curr) && std::islower(next))
			{
				if(i + 2 < line.length() && isdigit(line[i + 2]))
				{
					std::string name;
					name += curr;
					name += next;
					Molecule molecule(name);
					std::string number;
					for(int j = i + 2; std::isdigit(line[j]); j++)
						number += line[j];
					molecule.count = std::stoi(number);
					i += 2; //molecule name
					i += number.length(); //following number
					stack.push(molecule);
				}
				else
				{
					std::string name;
					name += curr;
					name += next;
					Molecule molecule(name);
					stack.push(molecule);
					i += 2;
				}
				continue;
			}

			if(std::isupper(curr) && std::isdigit(next))
			{
				std::string name;
				std::string number;
				for(int j = i + 1; std::isdigit(line[j]); j++)
					number += line[j];
				name += curr;
				Molecule molecule(name, std::stoi(number));
				stack.push(molecule);
				i += 1; //molecule name
				i += number.length();
				continue;
			}

			if(std::isupper(curr) && !std::isdigit(next))
			{
				std::string name;
				name += curr;
				Molecule molecule(name, 1);
				stack.push(molecule);
				i++;
				continue;
			}

			if(curr == '(')
			{
				stack.push(Molecule("(", 0)); //probably not a good idea
				i++;
				continue;
			}

			if(curr == ')')
			{
				std::vector<Molecule> molecules;
				int multiple = next - '0';
				while(true)
				{
					auto molecule = stack.top();
					stack.pop();
					if(molecule.name == "(")
						break;
					molecules.push_back(molecule);
				}
				for(auto& m: molecules)
				{
					m.count *= multiple;
					stack.push(m);
				}
				i += 2;
				continue;
			}
		}
		return stack;
	}