#include<bits/stdc++.h>
using namespace std;
struct player{
int cs,hp,nxt,last;
//cs 手牌数
//hp 生命值
char id,card[2010];//id 身份
bool zgln;//是否装备了【诸葛连弩】
};
player a[20];
char kn[11],kpd[2010],sss[10];
//kn 表示在主公眼里这只猪的身份
//kpd 卡牌堆
int n,m;
int fz;//fz 反贼数量
bool ed;//ed 判断游戏是否结束
void mp(int x){
if(!m){
m++;
}
a[x].card[++a[x].cs]=kpd[m];
m--;
}//mp 【摸牌】
void js(int x1,int x2) {
for(int i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='P'){
a[x2].card[i]='U';
a[x2].hp++;
return;
}//判断是否有【桃】
}
a[a[x2].nxt].last=a[x2].last;
a[a[x2].last].nxt=a[x2].nxt;//死亡后改变攻击距离
if(x2==1){
ed=1;
return;
}
if(a[x2].id=='F'){
fz--;
}
if(!fz){
ed=1;
return;
}//没有反贼游戏结束
if(a[x2].id=='F'){
mp(x1),mp(x1),mp(x1);
}//击杀反贼摸三张牌
if(a[x2].id=='Z' && a[x1].id=='M'){
a[x1].cs=0;
a[x1].zgln=0;
}//如果主公把忠臣杀了那就要弃牌
}//js 【击杀】
void Kill(int x1,int x2){
for(int i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='D'){
a[x2].card[i]='U';
return;
}
}
a[x2].hp--;
if(!a[x2].hp){
js(x1,x2);
}
//每次造成伤害都要判断被攻击者是否空血
//然后进入【击杀】环节
}//Kill【杀】
bool wxkj(int x1,int x2,int x3){
int i=x1;
while(1){
if(x3==1){
if(kn[x2]==a[i].id || (kn[x2]=='M' && a[i].id=='Z') || (kn[x2]=='Z' && a[i].id=='M')){
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]=='J'){
a[i].card[j]='U';
kn[i]=a[i].id;
return !wxkj(i,x1,0);
}
}
}//假如是敌对的那就【无懈可击】掉
}
else{
if(((a[i].id=='M' || a[i].id=='Z') && kn[x1]=='F') || (a[i].id=='F' && (kn[x1]=='M' || kn[x1]=='Z'))){
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]=='J'){
a[i].card[j]='U';
kn[i]=a[i].id;
return !wxkj(i,x1,0);
}
}
}
}
i=a[i].nxt;
if(i==x1){
break;
}//没有人用【无懈可击】抵挡此【无懈可击】那么这张牌就生效
}
return 0;
}//wxkj【无懈可击】
void nmrq(int x1){
for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
if(!wxkj(x1,x2,1)){
int i;
for(i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='K'){
a[x2].card[i]='U';
break;
}
}
if(i>a[x2].cs){
a[x2].hp--;
if(x2==1 && kn[x1]=='U'){
kn[x1]='L';
}
if(!a[x2].hp){
js(x1,x2);
}
if(ed){
return;
}
}
}//判断是否被【无懈可击】掉
}//进行一个循环来出牌
}//nmrq【南蛮入侵】
void wjqf(int x1){
for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
if(!wxkj(x1,x2,1)){
int i;
for(i=1;i<=a[x2].cs;i++){
if(a[x2].card[i]=='D'){
a[x2].card[i]='U';
break;
}
}
if(i>a[x2].cs){
a[x2].hp--;
if(x2==1 && kn[x1]=='U'){
kn[x1]='L';
}
if(!a[x2].hp){
js(x1,x2);
}
if(ed){
return;
}
}
}//判断是否被【无懈可击】掉
}
}//wjqf【万箭齐发】
void jd(int x1,int x2){
int j,k;
if(wxkj(x1,x2,1)){
return;
}//判断是否被【无懈可击】掉
if(x1==1 && a[x2].id=='Z'){
a[x2].hp--;
if(!a[x2].hp){
js(x1,x2);
}
return;
}
j=k=1;
while(1){
while(a[x2].card[j]!='K' && j<=a[x2].cs){
j++;
}
if(j>a[x2].cs){
a[x2].hp--;
if(!a[x2].hp){
js(x1,x2);
}
return;
}
else{
a[x2].card[j]='U';
}
while(a[x1].card[k]!='K' && k<=a[x1].cs){
k++;
}
if(k>a[x1].cs){
a[x1].hp--;
if(!a[x1].hp){
js(x1,x2);
}
return;
}
else{
a[x1].card[k]='U';
}
}
}//jd【决斗】
void hh(){
char nc;//nc 现在的手牌
ed=1;
if(fz){
ed=0;
}
if(ed){
return;
}
for(int i=1;i;i=a[i].nxt){
mp(i),mp(i);
bool kil=1;
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]!='U'){
if(!a[i].hp){
break;
}
nc=a[i].card[j];
if(nc=='P'){
if(a[i].hp!=4){
a[i].hp++,a[i].card[j]='U';
}
continue;
}//使用【桃】
if(nc=='K'){
if(!kil && !a[i].zgln){
continue;
}
if(a[i].id=='M' && kn[a[i].nxt]!='L' && kn[a[i].nxt]!='F'){
continue;
}
if(a[i].id=='Z' && kn[a[i].nxt]!='F'){
continue;
}
if(a[i].id=='F' && kn[a[i].nxt]!='Z' && kn[a[i].nxt]!='M'){
continue;
}
a[i].card[j]='U';
Kill(i,a[i].nxt);
kn[i]=a[i].id,kil=0;
if(ed){
return;
}
continue;
}//使用【杀】
if(nc=='F'){
if(a[i].id=='F'){
a[i].card[j]='U',jd(i,1);
kn[i]=a[i].id;
if(ed){
return;
}
j=0;
continue;
}
for(int k=a[i].nxt;k!=i;k=a[k].nxt){
if((a[i].id=='M' && (kn[k]=='L' || kn[k]=='F')) || (a[i].id=='Z' && kn[k]=='F')){
a[i].card[j]='U',jd(i,k);
kn[i]=a[i].id;
if(ed){
return;
}
j=0;
break;
}
}
continue;
}//使用【决斗】
if(nc=='N'){
a[i].card[j]='U';
nmrq(i);
if(ed){
return;
}
j=0;
continue;
}//使用【南蛮入侵】
if(nc=='W'){
a[i].card[j]='U';
wjqf(i);
if(ed){
return;
}
j=0;
continue;
}//使用【万箭齐发】
if(nc=='Z'){
a[i].zgln=1;
a[i].card[j]='U';
j=0;
continue;
}//装备【诸葛连弩】
}//=='U'就是被使用过,弃置了
}
}
}//hh 进入回合
signed main(){
//HAPPY!
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].nxt=i+1,a[i].last=i-1;
}
a[n].nxt=1,a[1].last=n;
for(int i=1;i<=n;i++){
for(int j=1;j<2010;j++){
a[i].card[j]='U';
}
cin>>sss;
a[i].id=sss[0];
for(int j=1;j<=4;j++){
cin>>sss;
a[i].card[j]=sss[0];
}
a[i].cs=a[i].hp=4;//手牌上限和血量上限都是4
if(a[i].id=='F'){
fz++;
}//统计反贼的数量
a[i].zgln=0;
}
for(int i=2;i<=n;i++){
kn[i]='U';
}
kn[1]='M';
for(int i=1;i<=m;i++){
cin>>sss;
kpd[m-i+1]=sss[0];
}
hh();
if(a[1].hp<=0){//看看主公有没有挂
cout<<"FP\n";
}
else{
cout<<"MP\n";
}
for(int i=1;i<=n;i++){
if(a[i].hp<=0){
cout<<"DEAD\n";
}//空血凉凉
else{
for(int j=1;j<=a[i].cs;j++){
if(a[i].card[j]!='U'){
cout<<a[i].card[j]<<" ";
}
}
cout<<"\n";
}//亮牌
}
return 0;
}
rt