#include<bits/stdc++.h>
#define debug puts("114514")
using namespace std;
int diff[3][3]={{0,0,1},{0,0,1},{1,1,0}};
int n,m,fanzhu=0,sifan=0,rounds,temp[2005],used[2005];
struct Pig{
char card[2005];
int kind;
int hp=4;
int pre;
int nxt;
int dead;
int eq;
int cnt=4;
}pig[15];
deque<char> card_heap;
void input(){
string s;
cin>>n>>m;
fanzhu=sifan=0;
for(int i=1;i<=n;i++){
int lst=0;
pig[i].nxt=i%n+1;
cin>>s;
if(s=="FP")
fanzhu++;
pig[i].kind=(s!="FP")?((s!="ZP")?0:1):2;
for(int j=1;j<=4;j++){
cin>>pig[i].card[j];
}
}
pig[1].pre=1;
for(int i=1;i<=m;i++){
char x;
cin>>x;
card_heap.push_back(x);
}
}
void get_card(int x){
pig[x].card[++pig[x].cnt]=card_heap.front();
if(card_heap.size()>1)
card_heap.pop_back();
}
bool jg(int x){
int nxt=pig[x].nxt;
if(pig[nxt].pre==0)return 0;
else if(pig[nxt].pre==1)
return diff[pig[x].kind][pig[nxt].kind];
else
return pig[x].kind==0;
}
int atk(int x){
if(pig[x].kind==2)return 1;
for(int i=pig[x].nxt;i!=x;i=pig[i].nxt){
if(pig[i].dead)continue;
if((pig[i].kind==2&&pig[i].pre==1)||(pig[x].kind==0&&pig[i].pre==-1))
return i;
}
return -1;
}
void pend(int x,int y){
if(pig[x].kind==0&&pig[y].kind==1){
for(int i=1;i<=pig[x].cnt;i++){
used[i]=rounds;
pig[x].eq=0;
}
}
else if(pig[y].kind==2){
for(int i=0;i<3;i++)
get_card(x);
}
}
int find(int x,char y){
for(int i=1;i<=pig[x].cnt;i++){
if(pig[x].card[i]==y)
return i;
}
return 0;
}
void move(int x,int y,int z){
for(int i=y;i<z;i++)
pig[x].card[i]=pig[x].card[i+1];
}
void r_peach(int x,int y){
int z=find(x,'P');
if(x==y){
z=0;
for(int i=1;i<=pig[x].cnt;i++)
if(used[i]!=rounds&&pig[x].card[i]=='P'){
z=i;
break;
}
if(z)used[x]=rounds,pig[x].hp++;
return;
}
if(z){
pig[x].hp++;
move(x,z,pig[x].cnt);
pig[x].cnt--;
}
}
bool r_dodge(int x){
int z=find(x,'D');
if(z)move(x,z,pig[x].cnt),pig[x].cnt--;
return z;
}
bool r_kill(int x,int y){
int z=find(x,'K');
if(x==y){
z=0;
for(int i=1;i<=pig[x].cnt;i++)
if(used[i]!=rounds&&pig[x].card[i]=='K'){
z=i;
break;
}
if(z)used[x]=rounds;
return z;
}
if(z)move(x,z,pig[x].cnt),pig[x].cnt--;
return z;
}
bool r_wuxiekeji(int x,int y){
int z=find(x,'J');
if(x==y){
z=0;
for(int i=1;i<=pig[x].cnt;i++)
if(used[i]!=rounds&&pig[x].card[i]=='J'){
z=i;
break;
}
if(z)used[x]=rounds;
return z;
}
if(z)move(x,z,pig[x].cnt),pig[x].cnt--;
return z;
}
void lose_hp(int x,int y){
pig[x].hp--;
if(pig[x].hp<=0)
r_peach(x,y);
}
void ilink(int x){
for(int i=1;i<=n;i++)
if(!pig[i].dead&&pig[i].nxt==x){
pig[i].nxt=pig[x].nxt;
break;
}
}
void peach(int x){
pig[x].hp++;
}
void kill(int x){
int nxt=pig[x].nxt;
pig[x].pre=1;
if(!r_dodge(nxt)){
lose_hp(nxt,x);
if(pig[nxt].hp<=0){
if(pig[nxt].kind==2)++sifan;
pig[nxt].dead=1;
pig[x].nxt=pig[nxt].nxt;
}
if(fanzhu==sifan||pig[1].dead)
return;
if(pig[nxt].hp<=0)
pend(x,nxt);
}
}
bool wuxiekeji(int x,int y,int z,int w){
bool ret=w;
for(int i=x;;){
if(!pig[i].dead){
if(!w){
if(!diff[pig[i].kind][pig[z].kind]){
if(r_wuxiekeji(i,x)){
pig[i].pre=1;
return wuxiekeji(x,i,z,1-w);
}
}
}
else{
if(diff[pig[i].kind][pig[z].kind]){
if(r_wuxiekeji(i,x)){
pig[i].pre=1;
return wuxiekeji(x,i,z,1-w);
}
}
}
i=pig[i].nxt;
if(i==y)
break;
}
}
return ret;
}
void fight(int x,int y,int z){
pig[x].pre=1;
if(pig[y].pre==1)
if(wuxiekeji(x,x,y,0))
return;
for(;;){
if(pig[x].kind==0&&pig[y].kind==1){
lose_hp(y,z);
if(pig[y].hp<=0){
if(pig[y].kind==2)sifan++;
pig[y].dead=1;
ilink(y);
}
if(fanzhu==sifan||pig[1].dead)return;
if(pig[y].hp<=0)pend(x,y);
return;
}
else if(!r_kill(y,z)){
lose_hp(y,z);
if(pig[y].hp<=0){
if(pig[y].kind==2)++sifan;
pig[y].dead=1;
ilink(y);
}
if(fanzhu==sifan||pig[1].dead)return;
if(pig[y].hp<=0)pend(x,y);
return;
}
if(!r_kill(x,z)){
lose_hp(x,z);
if(pig[x].hp<=0){
if(pig[x].kind==2)++sifan;
pig[x].dead=1;
ilink(x);
}
if(fanzhu==sifan||pig[1].dead)return;
if(pig[x].hp<=0)pend(y,x);
return;
}
}
}
void nanzhuruqing(int x){
for(int i=pig[x].nxt;i!=x;i=pig[i].nxt){
if(pig[i].dead)continue;
if(pig[i].pre==1)
if(wuxiekeji(x,x,i,0))
continue;
if(!r_kill(i,x)){
lose_hp(i,x);
if(i==1&&pig[x].pre==0)
pig[x].pre=-1;
if(pig[i].hp<=0){
if(pig[i].kind==2)++sifan;
pig[i].dead=1;
ilink(i);
}
if(fanzhu==sifan||pig[1].dead)return;
if(pig[i].hp<=0)pend(x,i);
}
}
}
void wanjianqifa(int x){
for(int i=pig[x].nxt;i!=x;i=pig[i].nxt){
if(pig[i].dead)continue;
if(pig[i].pre==1)
if(wuxiekeji(x,x,i,0))
continue;
if(!r_dodge(i)){
lose_hp(i,x);
if(i==1&&pig[x].pre==0)
pig[x].pre=-1;
if(pig[i].hp<=0){
if(pig[i].kind==2)++sifan;
pig[i].dead=1;
ilink(i);
}
if(fanzhu==sifan||pig[1].dead)return;
if(pig[i].hp<=0)pend(x,i);
}
}
}
void zhugeliannu(int x){
pig[x].eq=1;
}
bool use_card(int x){
memset(used,0,sizeof(used));
int i,cntused,cntkill=0,counts,ret=-1,y;
char nw;
for(rounds=1;;rounds++){
cntused=counts=0;
for(i=1;i<=pig[x].cnt;i++){
if(used[i]!=rounds){
nw=pig[x].card[i];
switch(nw){
case 'P':
if(pig[x].hp<4)
peach(x),used[i]=rounds,cntused++,i=pig[x].cnt;
break;
case 'K':
if((!cntkill||pig[x].eq)&&jg(x))
kill(x),used[i]=rounds,cntused++,cntkill++,i=pig[x].cnt;
break;
case 'F':
y=atk(x);
if(y!=-1)
fight(x,y,x),used[i]=rounds,cntused++,i=pig[x].cnt;
break;
case 'N':
nanzhuruqing(x),used[i]=rounds,cntused++,i=pig[x].cnt;
break;
case 'W':
wanjianqifa(x),used[i]=rounds,cntused++,i=pig[x].cnt;
break;
case 'Z':
zhugeliannu(x),used[i]=rounds,cntused++,i=pig[x].cnt;
break;
default:
break;
}
if(fanzhu==sifan||pig[1].dead){
ret=1;
break;
}
if(pig[x].dead){
ret=0;
break;
}
}
}
for(int i=1;i<=pig[x].cnt;i++)
if(used[x]!=rounds)
temp[++counts]=pig[x].card[i];
for(int i=1;i<=counts;i++)
pig[x].card[i]=temp[i];
if(!cntused&&ret!=-1)
ret=0;
if(ret>-1)
return ret;
}
}
bool play(int x){
get_card(x);
get_card(x);
return use_card(x);
}
void d(){
for(int i=1,e=0;!e&&fanzhu>0;i=pig[i].nxt)
if(!pig[i].dead)
e=play(i);
}
void print(){
if(pig[1].dead)
puts("FP");
else
puts("MP");
for(int i=1;i<=n;i++){
if(pig[i].dead){
puts("DEAD");
continue;
}
if(pig[i].cnt>=1)
cout<<pig[i].card[1];
for(int j=2;j<=pig[i].cnt;j++)
cout<<" "<<pig[i].card[j];
puts("");
}
}
int main(){
input();
d();
print();
return 0;
}