/*
    题意: 模拟题

    一个人要submit(包含多个数据已修改的,目的是要更新服务器对应的版本)
    1)该数据之前更新的时间 < 该人获得数据的时间(SYNC 或 SUBMIT) 则更新服务器该数据的更新时间
    2)否则,如果该人的优先级大于之前修改的,则更新服务器该数据的更新时间
             否则不变

    按时间排个序搞就行了
    最后要输出被更新过的数据的最后修改者,数据没被修改过的话不用输出
*/

#include
<cstdio>
#include
<cstring>
#include
<algorithm>
#include
<vector>
#include
<map>

using namespace std;

const int MAXN = 10010;

map
<int,int> mp;

struct OP
{
    
int id,pr,kind,line;
    
int yy,mm,dd,h,m,s;
    
char str[10];
    
long long time;
    
void read(int _id,int _pr)
    
{
        id 
= _id;
        pr 
= _pr;
        scanf(
" [%d/%d/%d %d:%d:%d] %s",&yy,&mm,&dd,&h,&m,&s,str);
        
if(str[0]=='M')
        
{    
            kind 
= 2;
            scanf(
"%d",&line);
            mp[line] 
= -1;
        }

        
else 
        
{
            
if(str[1]=='Y')kind = 1;
            
else kind = 3;
        }

        time 
= s + m*60 + h*3600 + dd*3600*24 + mm*3600*24*31 + yy*(long long)3600*24*31*366;
    }

    
void print()
    
{
        printf(
"%d [%04d/%02d/%02d %02d:%02d:%02d] %d\n",id,yy,mm,dd,h,m,s,kind);
    }

    
bool operator<(const OP &B)const
    
{
        
return time<B.time;
    }

}
;

char name[MAXN][40];
vector
<int>MV[MAXN];
OP op[MAXN
*5];
long long get[MAXN];

int main()
{
    
//freopen("in","r",stdin);
    int n;
    
while(scanf("%d",&n),n)
    
{
        
int pr,m;
        
int tot = 0;
        mp.clear();
        
for(int i=1;i<=n;i++)
        
{
            scanf(
"%s%d%d",&name[i],&pr,&m);
            MV[i].clear();
            
for(int j=0;j<m;j++)
                op[tot
++].read(i,pr);
        }

        sort(op,op
+tot);
        
for(int i=0;i<tot;i++)
        
{
            
//op[i].print();
            int id = op[i].id;
            
if(op[i].kind==1)get[id] = op[i].time;
            
else if(op[i].kind==2)MV[id].push_back(op[i].line);
            
else
            
{
                
for(int j=0;j<MV[id].size();j++)
                
{
                    
int line = MV[id][j];
                    
long long last = mp[line]==-1?-1:op[mp[line]].time;
                    
if(last<get[id])mp[line] = i;
                    
else if(op[mp[line]].pr<op[i].pr)mp[line] = i;
                }

                MV[id].clear();
                
get[id] = op[i].time;
            }

        }

        
for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++)
        
{
            
if(it->second==-1)continue;//
            int id = it->second;
            printf(
"%d [%04d/%02d/%02d %02d:%02d:%02d] BY %s\n",it->first,op[id].yy,op[id].mm,op[id].dd,op[id].h,op[id].m,op[id].s,name[op[id].id]);
        }

        puts(
"END");
    }

    
return 0;
}