Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

func main() {
	stdin := bufio.NewScanner(os.Stdin)
	index := make(map[string]string)
	keys := []string{}
	for stdin.Scan() {
		l := strings.Split(stdin.Text(), " ")
		if l[0] == "0" {
			break
		}
		if index[l[0]] == "" {
			keys = append(keys, l[0])
		}
		index[l[0]] += l[1] + " "
	}
	sort.Strings(keys)
	for _, k := range keys {
		fmt.Println(k)
		p := strings.Split(strings.TrimRight(index[k], " "), " ")
		pages := []int{}
		for _, v := range p {
			i, _ := strconv.Atoi(v)
			pages = append(pages, i)
		}
		sort.Ints(pages)
		for i, v := range pages {
			if i > 0 {
				fmt.Printf(" ")
			}
			fmt.Printf("%d", v)
		}
		fmt.Println()
	}
}

C++: #include<stdio.h>
#include<string.h>

#include<stdio.h>

int main(){
  typedef struct {
    char s[31];
    int a;
  } book;
  
  book b[100];
  int i=0;
  while(scanf("%s %d", b[i].s, &b[i].a) != EOF){
    i++;
  }
  
  int j,k;
  for(j=0;j<i-1;j++){
    for(k=0;k<i-1;k++){
      if(strcmp(b[k].s, b[k+1].s)>0)
	{int p;char q[31];
	  p=b[k].a;b[k].a=b[k+1].a;b[k+1].a=p;
	  strcpy(q,b[k].s);strcpy(b[k].s,b[k+1].s);strcpy(b[k+1].s,q);
	}
    }
  }


  for(j=0;j<i-1;j++){
    for(k=0;k<i-1;k++){
      if(strcmp(b[k].s, b[k+1].s)==0){
	if(b[k].a > b[k+1].a){
	  int p;
	  p=b[k].a;b[k].a=b[k+1].a;b[k+1].a=p;
	}
      }
    }
  }

  printf("%s \n%d", b[0].s, b[0].a);
  for(j=1;j<i;j++){
    if(strcmp(b[j].s, b[j-1].s) != 0){
      printf("\n");
      printf("%s \n%d ", b[j].s, b[j].a);
    }
    else{
      printf("%d ", b[j].a);
    }
  }
  printf("\n");

  return 0;
}

C++: #include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
using namespace std;
int main() {
	string s; int n;
	set<string>st;
	map<string, vector<int>>m;
	while (cin >> s >> n) {
		st.insert(s);
		m[s].push_back(n);
	}
	for (auto i = st.begin(); i != st.end(); i++) {
		string str = *i;
		cout << str << endl;
		for (int j = 0; j < m[str].size(); j++) {
			if (j)cout << ' '; cout << m[str][j];
		}
		cout << endl;
	}
}

C++: #include<cstdio>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main() {
	map<string, vector<int> > D;
	string w;
	int n;
	while(cin >> w >> n) {
		D[w].push_back(n);
	}
	map<string, vector<int> >::iterator it = D.begin();
	for(; it != D.end(); it++) {
		cout << it->first << endl;
		int size = it->second.size();
		sort(it->second.begin(),it->second.end());
		for(int i = 0; i < size - 1; i++){
			cout << it->second[i] << " ";
		}
		cout << it->second[size-1] << endl;
	}
	return 0;
}

C++: #include <iostream>
#include <string>
#include <map>
#include <set>

using namespace std;

int main(){
  int page;
  string word;
  map<string, set<int> > index;

  while(cin >> word >> page){
    index[word].insert(page);
  }

  for(map<string, set<int> >::iterator i = index.begin(); i != index.end(); i++){
    cout << i -> first << endl;
    for(set<int>::iterator j = i -> second.begin(); j != i -> second.end(); j++){
      if(j != i -> second.begin() ){
        cout << " ";
      }
    cout << *j;
    }
    cout << endl;
  }
}

C++: #include <iostream>
#include <map>
#include <vector>
#include <algorithm>

int main(){
  std::string s;
  int p;
  std::map<std::string,std::vector<int> > m;
  while(std::cin>>s>>p,!std::cin.eof()){
    m[s].push_back(p);
  }
  std::map<std::string,std::vector<int> >::iterator m_it = m.begin();
  while(m_it!=m.end()){
    std::cout<<(*m_it).first<<std::endl;
    std::vector<int> v = (*m_it).second;
    std::sort(v.begin(),v.end());
    std::vector<int>::iterator v_it = v.begin();
    while(v_it!=v.end()){
      std::cout<<*v_it;
      v_it++;
      (v_it==v.end())?std::cout<<std::endl:std::cout<<" ";
    }
    m_it++;
  }
  return 0;
}

C++: #include <iostream>
#include <string>
#define MAX_N 101
using namespace std;

typedef struct{
string name;
int page;
}index;
index a[MAX_N];
index temp;
int n;
int main(){
	n=0;
	while(cin >> a[n].name >> a[n].page){
		n++;
	}

	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			if(a[j].name>a[j+1].name){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}else if(a[j].name==a[j+1].name&&a[j].page>a[j+1].page){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
	cout << a[0].name << endl;
	cout << a[0].page;
	for(int i=1;i<n;i++){
		if(a[i-1].name!=a[i].name){
			cout <<endl << a[i].name << endl;
			cout <<a[i].page;
		}else if(a[i-1].name==a[i].name){
			cout << " "<<a[i].page;
		}
	}
	cout <<endl;
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

int main() {
pair<string,int> p;
vector<pair<string,int> > v;
while(cin>>p.first>>p.second){
v.push_back(make_pair(p.first,p.second));
}
sort(v.begin(),v.end());
string bef="000";
for (int i = 0; i < v.size(); ++i) {
    if(bef!=v[i].first){
    	cout<<endl;
    	cout<<v[i].first<<endl;
    	cout<<v[i].second;
    	bef=v[i].first;
    }else{
    	cout<<" "<<v[i].second;
    }
}
//cout<<endl;
}

C++: #include <utility>
#include <vector>
#include <math.h>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

vector<pair<string, int> > v;
vector<pair<string, vector<int> > > l;
vector<string> w;

bool fa(int index) {
	for (int i = 0; i < l.size(); i++) {
		if (l[i].first == v[index].first) {
			l[i].second.push_back(v[index].second);
			return true;
		}
	}
	l.push_back({ v[index].first,vector<int>(1,v[index].second) });
	w.push_back(v[index].first);
	return false;
}

int search(int index) {
	for (int i = 0; i < l.size(); i++) {
		if (w[index] == l[i].first)
			return i;
	}
	return -1;
}

int main(){
	string s;
	int p;
	while (cin >> s >> p && p != 0) {
		v.push_back(pair<string, int>({ s,p }));
	}
	for (int i = 0; i < v.size(); i++) {
		fa(i);
	}
	sort(w.begin(), w.end());
	for (int i = 0; i < l.size(); i++) {
		sort(l[i].second.begin(), l[i].second.end());
	}
	for (int i = 0; i < w.size(); i++) {
		int index = search(i);
		cout << w[i] << endl;
		cout << l[index].second[0];
		for (int j = 1; j < l[index].second.size(); j++) {
			cout << " " << l[index].second[j];
		}
		cout << endl;
	}

	return 0;
}

C++: #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;
}

C++: #include<iostream>
#include<string>
using namespace std;

int main(){
    int n;
    string str;
    while(cin >>str){
        cin >>n;
        cerr <<str <<", " <<n <<endl;
    }
    return 0;
}