#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//快速排序,按首位元素升序
int cmp(const void *a, const void *b){
    return (*(int*)a - *(int*)b);
}

//找出在该数组的索引
//注意二维数组传参要写列数
int fun(int (*que)[2], int len, int target){
    for(int i = 0; i < len; i++){
        if(que[i][0]==target){
            return i;
        }
    }
    return -1;
}

int main(){
    int count = 0;
    scanf("%d\n",&count);
    //printf("%d\n",count);
    int que[500][2] = {0};
    int j = 0;
    for(int i = 0; i < count; i++){
        int ind = 0;
        int val = 0;
        scanf("%d %d\n", &ind, &val);
        //printf("%d %d\n", ind, val);
        //查询键是否已存在
        int temp = fun(que,j,ind);
        //不存在则添加到数组末尾
        if(temp == -1){
            que[j][0] = ind;
            que[j++][1] = val;
        }
        //存在则值相加
        else{
            que[temp][1] = que[temp][1] + val;
        }
    } 
    //快速排序,按首位元素(键)排序
    //注意,第二个元素是数组长度,所以是j而不是j-1;
    qsort(que,j,sizeof(int)*2,cmp);
    //遍历打印
    for(int i = 0; i < j; i++){
        printf("%d %d\n",que[i][0],que[i][1]);
    }  
    return 0;
}