#include<bits/stdc++.h>
using namespace std;
struct node{
int time,status;
bool operator<(const node&a)const{
return time<a.time;
}
};
int main(){
int n,k;
cin>>n>>k;
unordered_map<string,vector<node>>car;
char id[10],st[10];
while(n--){
int hh,mm,ss;
scanf("%s %d:%d:%d %s",id,&hh,&mm,&ss,st);
int t=hh*3600+mm*60+ss;
int s = 0;
if (st[0] == 'o') s = 1;
car[id].push_back({t,s});
}
vector<node>E;//存储有效记录
map<string,int>park;
for(unordered_map<string,vector<node>>::iterator it=car.begin();it!=car.end();it++){
vector<node>t=it->second;
sort(t.begin(), t.end());//!!!!!!注意一定要排序因为输入是乱序输入的
int ans=0;
for(int i=1;i<t.size();i++){
if (t[i].status == 1&& t[i - 1].status == 0){
E.push_back(t[i-1]);
E.push_back(t[i]); //存进去是一对一对的
ans+=t[i].time-t[i-1].time;
}
}
park[it->first]=ans;//存这个车总共停留时间
}
int k1 = 0, sum = 0;//查询时间是升序给出的
sort(E.begin(),E.end());//注意这边按照时间排序,可能是 in in out,这
//样就是进来一辆车,因为这里面都是有效记录
while (k -- )
{
int hh, mm, ss;
scanf("%d:%d:%d", &hh, &mm, &ss);
int t = hh * 3600 + mm * 60 + ss;
while (k1 < E.size() && E[k1].time <= t)
{
if (E[k1].status == 0) sum ++ ;//in则加 1 ,out减 1
else sum -- ;
k1++ ;
}
printf("%d\n", sum);
}
int maxtime=-1; //最大停留时间 ,注意可能有多个
for(map<string,int>::iterator it=park.begin();it!=park.end();it++){
if((*it).second>maxtime){
maxtime=(*it).second;
}
}
vector<string>res;
for(map<string,int>::iterator it=park.begin();it!=park.end();it++){
if((*it).second==maxtime){
res.push_back((*it).first);
}
}
sort(res.begin(),res.end());
for(int i=0;i<res.size();i++){
cout<<res[i]<<' ';
}
printf("%02d:%02d:%02d\n", maxtime / 3600, maxtime % 3600 / 60, maxtime % 60);
return 0;
}