#include <bits/stdc++.h>
using namespace std;
struct rec {
    pair<string, string> re; //记录
    int times;//错误次数
};
rec Q[200];//储存八条我们要选择出来的记录
int front = 0; //我们要选择出来的记录的开头
int Q_size = 0; //我们目前选择出来的记录
int main() {
    string s;
    vector<rec> r;//储存迄今为止所有记录(重复就没必要记录)
    while (getline(cin, s)) { //循环输入每条记录
        rec one;
        int pos1, pos2; //找到最后一个\和空格所在位置
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '\\')  pos1 = i;
            if (s[i] == ' ') pos2 = i;
        }
        string name, cows; //存储文件名和行号
        name = s.substr(pos1 + 1, pos2 - pos1 - 1);
        if (name.length() > 16) name = name.substr(name.length() - 16); //取后面16个
        cows = s.substr(pos2 + 1);
        one.re.first = name;
        one.re.second = cows;
        one.times = 1;
        bool isrepeate = 0;
        //看看队列里面有没有重复的,如果有,错误次数+1,不需要继续操作了
        for (int i = front; i < front + Q_size; i++) {
            if (Q[i].re == one.re) {
                Q[i].times++;
                isrepeate = 1; //和队列的重复
            }
        }
        if (isrepeate == 1) continue;
        //看看和曾经出现的记录有没有重复的,如果有,不用管,因为已经被队列淘汰,也是不需要继续操作了
        bool isrepeate2 = 0;
        if (isrepeate == 0) {
            for (int i = 0; i < r.size(); i++) {
                if (r[i].re == one.re) {
                    isrepeate2 = 1; //和曾经出现过,又已经被队列淘汰的重复
                    break;
                }
            }
        }
        if (isrepeate2 == 1) continue;;
        //如果既不和队列中已经有的记录冲突,也不和曾经输入过的记录冲突,那么将其入队
        if (isrepeate == 0) {
            if (Q_size == 8) { //如果队满了,出队一个
                front++;
                Q_size--;
            }
            Q[front + Q_size] = one;
            Q_size++;
        }
        r.push_back(
            one);//所有记录应该保存在r中(重复的已经在之前被剔除)
    }
    //输出结果
    for (int i = front; i < front + Q_size;
            i++)  cout << Q[i].re.first << " " << Q[i].re.second << " " << Q[i].times <<
                           endl;
}
// 64 位输出请用 printf("%lld")