#include <iostream>
#include <string>
#include <map>
#include <set>
using namespace std;
int main(){
	map<string,set<int> >index;
	string tmp;
	int tmp2;
	
	while(cin>>tmp>>tmp2){
		index[tmp].insert(tmp2);
	}
	
	map<string,set<int> >::iterator k=index.begin();
	while(k!=index.end()){
		
		tmp2=0;
		set<int>::iterator g=index[k->first].begin();
		cout<<k->first<<endl;
		while(g!=index[k->first].end()){
			if(tmp2)cout<<" ";
			cout<<(*g);
			g++,tmp2++;
		}
		cout<<endl;
		k++;
		
	}
	/*
	C++ マップ(std::map)
	
	C++ マップはキー／値の対を保持する連想コンテナである。
	
	begin()	マップの先頭を指すイテレータを返す。
	clear()	全ての要素を削除する
	count()	キー値が一致する要素の数を返す
	empty()	マップが空なら真
	end()	マップの末尾を指すイテレータを返す
	equal_range()	特定のキーと一致する先頭・末尾要素を指すイテレータを返す
	erase()	要素を削除する
	find()	要素を検索する
	get_allocator()	マップのアロケータを返す
	insert()	要素を挿入する
	key_comp()	キーを比較する関数を返す
	lower_bound()	キーが特定の値以上である最初の要素を指すイテレータを返す
	max_size()	要素の最大数を返す
	rbegin()	マップの末尾を指すリバースイテレータを返す
	rend()	マップの先頭を指すリバースイテレータを返す
	size()	マップ中の要素数を返す
	swap()	二つのマップを入れ替える
	upper_bound()	キーが特定の値を越える最初の要素を指すイテレータを返す
	value_comp()	値を比較する関数を返す
	*/
	
	return 0;
}
