#include <cstdlib>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#include <map>
#include "queue"
#include "cstring"

typedef pair<string,string> PII;  
priority_queue<PII,vector<PII>,greater<PII>> open;  //小根堆找最早签到
priority_queue<PII> close; // 大根堆 找 最晚签到的人
int n;
int main() {
    cin >> n;
    while(n--){
        string id,optime,cltime;
        cin >> id >> optime >> cltime;
        optime.erase(2,1);
        optime.erase(4,1);
        cltime.erase(2,1);
        cltime.erase(4,1);
        
        open.push(PII{optime,id});
        close.push(PII{cltime,id});
    }
    string ido=open.top().second;
    string clo=close.top().second;
    cout << ido <<' '<<clo <<endl ;


}
// 64 位输出请用 printf("%lld")

一开始 没好好看题 , 以为中间 没人 的时候 也要关门 想了半天

再一看 原来 是 每天第一个到开门 , 最后一个才关门 不用管 中间情况

那就直接用两个 堆存 开门时间和 关门时间就可以了 一个小根堆 一个大根堆

注 : 堆默认 排序 字符串 的字典序 排

所以时间 就按字符串存 就可以 ,其实 erase 这两句也不用写