#include<stdio.h>
#include<string.h>
typedef struct ErrRecord {
  char name[20];
  int line;
  int count;
} ErrRecord;

int main() {
  ErrRecord record[100];
  int rindex = -1;

  char str[100];
  int line;
  while (EOF != scanf("%s%d", str, &line)) {
    int i, j;
    int len = strlen(str);
    char name[20];
    for (i = len - 1; i >= 0; i--) {
      if (str[i] == '\\')
        break;
    }
    //从i+1 下一位开始复制,还有考虑长度不能超过16
    if (i + 1 < len - 16) {
      strcpy(name, str + len - 16);
    } else {
      strcpy(name, str + i + 1);
    }
    int flag =
      0; //标志能否在前面发现相同的记录 1:发现,0:未发现。
    for (i = 0; i <= rindex; i++) {
      if ( (0 == strcmp(name, record[i].name)) && (line == record[i].line) ) {
        record[i].count++;
        flag = 1;
        break;
      }
    }

    if (0 == flag) {
      ++rindex;
      strcpy(record[rindex].name, name);
      record[rindex].line = line;
      record[rindex].count = 1;
    }

  }

  int temp_buff[rindex + 1];
  int temp;
  int j, k;

  for (j = 0; j <= rindex; j++) {
    temp_buff[j] = record[j].count;
  }
  //冒泡排序
  for (j = 0; j <= rindex; j++ ) {
    for (k = 0 ; k <= rindex - j - 1; k++) {
      if (record[k].count < record[k + 1].count) {
        temp = record[k + 1].count;
        record[k + 1].count = record[k].count;
        record[k].count = temp;
      }
    }
  }
  //最多只输出8条
  for (j = 0; j <= 7; j++) {
    for (k = 0 ; k <= rindex; k++) {
      if (record[j].count == temp_buff[k]) {
        printf("%s %d %d\n", record[k].name, record[k].line, temp_buff[k]);
        temp_buff[k] = 0;
        break;
      }
    }
  }

  return 0;
}