0pts
#include<bits/stdc++.h>
//------------------------------//
using namespace std;
#define a p
#define perfo purfo
int n,m,shengdefan,rounds,sidefan,ret;
bool diff[3][3]={{0,0,1},{0,0,1},{1,1,0}};
int tmp[2080];
int use[2080];
bool youzhu=true;
deque<char>paidui;
struct pig{
int zhenyin;
int tili,next,die,paishu=4;
int tiao=0;//-1是反,0是还没跳,1是忠
int lei=0;//同上
int purfo;int zhuangbei;
char pai[2080];
}p[11];
void shan(int x,int start,int over){
for(int i=start;i<over;i++){
a[x].pai[i]=a[x].pai[i+1];
}
}
int find(int x,char need){
for(int i=1;i<=a[x].paishu;i++){
if(a[x].pai[i]==need) return i;
}
return 0;
}
void chutao(int x,int user){
int re=find(x,'P');
if(x==user){
re=0;
for(int i=1;i<=a[x].paishu;i++){
if(use[i]!=rounds and a[x].pai[i]=='P'){
re=i;
break;
}
}
if(re) use[re]=rounds,a[x].tili++;
return;
}
if(re) a[x].tili++,shan(x,re,a[x].paishu),a[x].paishu--;
}
void diaoxue(int x,int user){
a[x].tili--;
if(a[x].tili<1){
chutao(x,user);
}
}
void input(){
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].tili=4;
a[i].die=a[i].perfo=a[i].zhuangbei=0;
string s;
cin>>s;
if(s=="FP") a[i].zhenyin=2;
else if(s=="MP") a[i].zhenyin=0;
else if(s=="ZP") a[i].zhenyin=1;
for(int j=1;j<=4;j++){
cin>>p[i].pai[j];
}
p[i].next=i+1;
if(i==n) p[i].next=1;
}
for(int i=1;i<=m;i++){
char ch;
cin>>ch;
paidui.push_back(ch);
}
}
bool chushan(int x){
int re=find(x,'D');
if(re>0){
shan(x,re,a[x].paishu--);
return true;
}
return false;
}
void dakill(int x){
int next=a[x].next;
a[x].purfo=1;
if(!chushan(next)){
a[next].tili--;
if(a[next].tili<1) chutao(next,x);
if(a[next].tili<1) sidefan+=(a[next].zhenyin==2),a[next].die=1,a[x].next=a[next].next;
if(shengdefan==sidefan or a[1].die) return;
if(a[next].tili<1) {
if(a[x].zhenyin==0 and a[next].zhenyin==1){
for(int i=1;i<=a[x].paishu;i++) use[i]=rounds;
a[x].zhuangbei=0;
}
else if(a[next].zhenyin==2){
for(int q=1;q<=3;q++){
p[x].pai[++p[x].paishu]=paidui.front();
if(paidui.size()>1) paidui.pop_front();
}
}
}
}
}
bool chuwuxie(int x,int user){
int re=find(x,'J');
if(x==user){
re=0;
for(int i=1;i<=a[x].paishu;i++){
if(use[i]!=rounds and a[x].pai[i]=='J'){
re=i;
break;
}
}
if(re) use[re]=rounds;
return re;
}
if(re) shan(x,re,a[x].paishu),a[x].paishu--;
return re;
}
bool dawuxie(int user,int x,int aim,int now){
bool ret=now;
for(int next=x;;){
if(!a[next].die){
if(!now){
if(!diff[a[next].zhenyin][a[aim].zhenyin]){
if(chuwuxie(next,user)) {
a[next].perfo=1;
return dawuxie(user,next,aim,1-now);
}
}
}else{
if(diff[a[next].zhenyin][a[aim].zhenyin]){
if(chuwuxie(next,user)){
a[next].perfo=1;
return dawuxie(user,next,aim,1-now);
}
}
}
next=a[next].next;
if(next==x) break;
}
}
return ret;
}
void changelink(int x){
for(int pre=1;pre<=n;pre++){
if(!a[pre].die and a[pre].next==x){
a[pre].next=a[x].next;
break;
}
}
}
void pend(int x,int y){
if(a[x].zhenyin==0 and a[y].zhenyin==1){
for(int i=1;i<=a[x].paishu;i++){
use[i]=rounds;a[x].zhuangbei=0;
}
}else if(a[y].zhenyin==2){
for(int q=1;q<=3;q++){
p[x].pai[++p[x].paishu]=paidui.front();
if(paidui.size()>1) paidui.pop_front();
}
}
}
bool chukill(int x,int user){
int re=find(x,'D');
if(re){
shan(x,re,a[x].paishu),a[x].paishu--;
}
return re;
}
void dafight(int x,int aim,int user){
a[x].perfo=1;
if(a[aim].perfo==1){
if(dawuxie(x,x,aim,0)) return;
}
for(;;){
if(a[x].zhenyin==0 and a[aim].zhenyin==1){
a[aim].tili--;
if(a[aim].tili<1){
chutao(aim,user);
}
if(a[aim].tili<1) sidefan+=(a[aim].zhenyin==2),a[aim].die=1,changelink(aim);
if(shengdefan==sidefan or a[1].die) return;
if(a[aim].tili<1) pend(x,aim);
return;
}else
if(!chukill(aim,user)){
diaoxue(aim,user);
if(a[aim].tili<1) sidefan+=(a[aim].zhenyin==2),a[aim].die=1,changelink((aim));
if(shengdefan==sidefan or a[1].die) return;
if(a[aim].tili<1) pend(x,aim);
return;
}
if(!chukill(x,user)){
diaoxue(x,user);
if(a[x].tili<1) sidefan+=(a[x].zhenyin==2),a[x].die=1,changelink(x);
if(shengdefan==sidefan or a[1].die) return;
if(a[x].tili<1) pend(aim,x);
return;
}
}
}
void dananzhu(int x){
for(int next=a[x].next;next!=x;next=a[next].next){
if(!a[next].die){
if(a[next].perfo==1){
if(dawuxie(x,x,next,0)) continue;
}
}
if(!chukill(next,x)){
diaoxue(next,x);
if(next==1 and a[x].perfo==0) a[x].perfo=-1;
if(a[next].tili<1) sidefan+=(a[next].zhenyin==2),a[next].die=1,changelink(next);
if(shengdefan==sidefan or a[1].die) return;
if(a[next].tili<1) pend(x,next);
}
}
}
int atk(int x){
if(a[x].zhenyin==2) return 1;
for(int next=a[x].next;next!=x;next=a[next].next){
if(!a[next].die){
if(a[next].zhenyin==2 and a[next].perfo==1 or a[x].zhenyin==0 and a[next].perfo==-1) return next;
}
}
return -1;
}
bool ought(int x){
int next=a[x].next;
if(a[next].perfo==0) return 0;
if(a[next].perfo==1) return diff[a[x].zhenyin][a[next].zhenyin];
return a[x].zhenyin==0;
}
void dawanjian(int x){
for(int next=a[x].next;next!=x;next=a[next].next){
if(!a[next].die){
if(a[next].perfo==1){
if(dawuxie(x,x,next,0)) continue;
}
if(!chushan(next)){
diaoxue(next,x);
if(next==1 and a[x].perfo==0) a[x].perfo=-1;
if(a[next].tili<1) sidefan+=(a[next].zhenyin==2),a[next].die=1,changelink((next));
if(shengdefan==sidefan or a[1].die) return ;
if(a[next].tili<1) pend(x,next);
}
}
}
}
bool chupai(int x){
memset(use,0,sizeof(use));
int usepai=0,kill,ret=-1,counts;
for(int rounds=1;;rounds++){
for(int i=1;i<=p[x].paishu;i++){
if(use[i]!=rounds){
//--------
char np;
np=p[x].pai[i];
if(np=='P') {
if(a[x].tili<4) a[x].tili++,use[i]=rounds,usepai++,i=a[x].paishu;
} else if(np=='K'){
if((!kill or a[x].zhuangbei) and ought(x)) dakill(x),use[i]=rounds,usepai++,i=a[i].paishu;
}else if(np=='F'){
int aim=atk(x);
if(aim!=-1){
dafight(x,aim,x),use[i]=rounds,usepai++,i=a[x].paishu;
}
}else if(np=='N'){
dananzhu(x);
use[i]=rounds,usepai++,i=a[x].paishu;
}else if(np=='W'){
dawanjian(x);
use[i]=rounds,usepai++,i=a[x].paishu;
}else if(np=='Z'){
a[x].zhuangbei=1;
use[i]=rounds,usepai++,i=a[x].paishu;
}
//---------
if(shengdefan==sidefan or a[1].die) {ret=1;break;}
if(a[x].die){ret=0;break;}
}
for(int i=1;i<=a[x].paishu;i++) if(use[i]!=rounds) tmp[++counts]=a[x].pai[i];
for(int i=1;i<=counts;i++) a[x].pai[i]=tmp[i];a[x].paishu=counts;
if(!usepai and ret!=-1) ret=0;
if(ret>-1) return ret;
}
}
}
bool play(int x){
//下面是抽牌
for(int q=1;q<=2;q++){
p[x].pai[++p[x].paishu]=paidui.front();
if(paidui.size()>1) paidui.pop_front();
}
//上面是抽牌
return chupai(x);
}
signed main(){
input();
for(int i=1,event=0;!event and shengdefan>0 and youzhu;i=p[i].next){
if(p[i].die==true) continue;
event=play(i);
}
printf("%s\n",a[1].die?"FP":"MP");
for(int i=1;i<=n;i++){
if(a[i].die) printf("DEAD");
else{
if(a[i].pai>0){
printf("%c",a[i].pai[1]);
}
for(int j=2;j<=a[i].paishu;j++) printf(" %c",a[i].pai[j]);
}
puts("");
}
return 0;
}