#include<bits/stdc++.h>
#define int long long
#define db long double
#define Pii pair<int,int>
#define fi first
#define se second
#define swap(x,y) x^=y^=x^=y
#define f(x,y) fixed<<setprecision(y)<<x
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,rp,stdin),p1==p2)?EOF:*p1++)
using namespace std;
const int N=2e3+10;
const int rp=1e6+10;
int n,m,top;
struct node{
int q,hp,tiao,dead;
int z;
vector<int> vt;
}p[15];
string s[N];
char buf[rp],*p1=buf,*p2=buf;
inline int read()
{
int x=0,f=1; char c=0;
while(!isdigit(c)){if(c=='-') f=-1; c=gc();}
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=gc();
return x*f;
}
inline char read_ch()
{
char c=0;
while(!isalpha(c)) c=gc();
return c;
}
void jieshu()
{
int qwq;
for(int i=1;i<=n;++i)
{
if(p[i].dead) cout<<"DEAD\n";
else
{
for(int j=0;j<p[i].vt.size();++j)
{
qwq=p[i].vt[j];
if(qwq==1) cout<<"P ";
else if(qwq==2) cout<<"K ";
else if(qwq==3) cout<<"D ";
else if(qwq==4) cout<<"F ";
else if(qwq==5) cout<<"N ";
else if(qwq==6) cout<<"W ";
else if(qwq==7) cout<<"J ";
else if(qwq==8) cout<<"Z ";
}
cout<<"\n";
}
}
exit(0);
}
void napai(int x,int a)
{
if(s[a]=="P") p[x].vt.push_back(1);
else if(s[a]=="K") p[x].vt.push_back(2);
else if(s[a]=="D") p[x].vt.push_back(3);
else if(s[a]=="F") p[x].vt.push_back(4);
else if(s[a]=="N") p[x].vt.push_back(5);
else if(s[a]=="W") p[x].vt.push_back(6);
else if(s[a]=="J") p[x].vt.push_back(7);
else if(s[a]=="Z") p[x].vt.push_back(8);
}
int xia(int x)
{
for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
if(!p[i].dead) return i;
}
int shang(int x)
{
for(int i=(x==1?n:x-1);i!=x;i=(i==1?n:i-1))
if(!p[i].dead) return i;
}
int find(int x)
{
if(p[x].q==3) return 1;
for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
{
if(!p[i].dead)
{
if(p[x].q==1&&p[i].tiao>=2) return i;
if(p[x].q==2&&p[i].tiao==2) return i;
}
}
return 0;
}
void binsi(int x,int y)
{
for(int i=0;i<p[y].vt.size();++i)
{
if(p[y].vt[i]==1) ++p[y].hp,p[y].vt.erase(p[y].vt.begin()+i),--i;
if(p[y].hp>0) return;
}
p[y].dead=1; p[y].vt.clear(); p[y].z=0;
if(p[y].q==1)
{
cout<<"FP\n";
jieshu();
}
if(p[y].q==3)
{
bool flag=1;
for(int i=1;i<=n;++i)
if(p[i].q==3&&p[i].dead==0) flag=0;
if(flag) cout<<"MP\n",jieshu();
for(int ttt=1;ttt<=3;ttt++)if(top==m) napai(x,top); else napai(x,++top);
}
if(p[x].q==1&&p[y].q==2)
{
p[x].vt.clear(); p[x].z=0;
}
}
void biaodi(int x,int y)
{
if(p[x].q==1||p[x].tiao==1||p[x].tiao==2) return;
if(p[y].tiao==1||p[y].q==1) p[x].tiao=2;
if(p[y].tiao==2) p[x].tiao=1;
}
void xianyin(int x,int y)
{
if(p[x].q==1||p[x].tiao==1||p[x].tiao==2) return;
if(p[y].tiao==1||p[y].q==1) p[x].tiao=1;
if(p[y].tiao==2) p[x].tiao=2;
}
int find_wx(int x)
{
for(int i=0;i<p[x].vt.size();++i)
if(p[x].vt[i]==7) return i;
return 114514;
}
bool ask_wx(int x,int y,int a)
{
if(!(p[y].tiao==1||p[y].tiao==2||p[y].q==1)) return 1;
#define qi p[i].vt.erase(p[i].vt.begin()+a)
bool qwq=1;
while(1)
{
bool flag=0;
for(int i=a,j=1;j<=n;i=(i==n?1:i+1),++j)
{
if(p[i].dead) continue;
int a=find_wx(i);
if(a==114514) continue;
if(qwq)
{
if(p[i].q==1&&(p[y].tiao==1||y==1)) qi,qwq=0;
else if(p[i].q==2&&(p[y].tiao==1||y==1)) qi,qwq=0;
else if(p[i].q==3&&p[y].tiao==2) qi,qwq=0;
else if(p[i].q==1&&p[x].tiao>=2) qi,qwq=0;
else if(p[i].q==2&&p[x].tiao==2) qi,qwq=0;
else if(p[i].q==3&&(p[x].q==1||p[x].tiao==1)) qi,qwq=0;
if(!qwq) xianyin(i,y),biaodi(i,x),flag=1;
}
else
{
if(p[i].q==1&&(p[x].tiao==1||x==1)) qi,qwq=1;
else if(p[i].q==2&&(p[x].tiao==1||x==1)) qi,qwq=1;
else if(p[i].q==3&&p[x].tiao==2) qi,qwq=1;
else if(p[i].q==1&&p[y].tiao>=2) qi,qwq=1;
else if(p[i].q==2&&p[y].tiao==2) qi,qwq=1;
else if(p[i].q==3&&(p[y].q==1||p[y].tiao==1)) qi,qwq=1;
if(qwq) xianyin(i,x),biaodi(i,y),flag=1;
}
}
if(!flag) break;
}
#undef qi
return qwq;
}
void sha(int x,int y)
{
biaodi(x,y);
for(int i=0;i<p[y].vt.size();++i)
if(p[y].vt[i]==3)
{p[y].vt.erase(p[y].vt.begin()+i); return;}
--p[y].hp;
if(p[y].hp<=0) binsi(x,y);
}
void jd(int x,int y)
{
biaodi(x,y);
if(!ask_wx(x,y,x)) return;
if(p[x].q==1&&p[y].q==2)
{
--p[y].hp;
if(p[y].hp<=0) binsi(x,y);
return;
}
bool flag;
for(int i=1;;++i)
{
flag=0;
if(i&1)
{
for(int i=0;i<p[y].vt.size();++i)
if(p[y].vt[i]==2)
{
p[y].vt.erase(p[y].vt.begin()+i);
flag=1; break;
}
if(!flag)
{
--p[y].hp; if(p[y].hp<=0) binsi(x,y);
return;
}
}
else
{
for(int i=0;i<p[x].vt.size();++i)
if(p[x].vt[i]==2)
{
p[x].vt.erase(p[x].vt.begin()+i);
flag=1; break;
}
if(!flag)
{
--p[x].hp; if(p[x].hp<=0) binsi(y,x);
return;
}
}
}
}
void nanm(int x)
{
for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
{
bool flag=0;
if(p[i].dead) continue;
if(!ask_wx(0,i,x)) continue;
for(int j=0;j<p[i].vt.size();++j)
if(p[i].vt[j]==2)
{
p[i].vt.erase(p[i].vt.begin()+j);
flag=1; break;
}
if(!flag)
{
--p[i].hp;
if(p[i].q==1&&!p[x].tiao) p[x].tiao=3;
if(p[i].hp<=0) binsi(x,i);
}
}
}
void wanj(int x)
{
for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
{
bool flag=0;
if(p[i].dead) continue;
if(!ask_wx(0,i,x)) continue;
for(int j=0;j<p[i].vt.size();++j)
if(p[i].vt[j]==3)
{
p[i].vt.erase(p[i].vt.begin()+j);
flag=1; break;
}
if(!flag)
{
--p[i].hp;
if(p[i].q==1&&!p[x].tiao) p[x].tiao=3;
if(p[i].hp<=0) binsi(x,i);
}
}
}
void huihe(int x)
{
#define qi p[x].vt.erase(p[x].vt.begin()+i),i=-1
if(p[x].dead) return; bool flag=0;
for(int ttt=1;ttt<=2;ttt++)if(top==m) napai(x,top); else napai(x,++top);
for(int i=0;i<p[x].vt.size();++i)
{
int v=p[x].vt[i];
if(v==1) {if(p[x].hp<4) qi,++p[x].hp;}
else if(v==2&&(flag==0||p[x].z==1))
{
if(p[x].q==1)
{
if(p[xia(x)].tiao>1) qi,sha(x,xia(x)),flag=1;
}
else if(p[x].q==2)
{
if(p[xia(x)].tiao==2) qi,sha(x,xia(x)),flag=1;
}
else
{
if(p[xia(x)].q==1||p[xia(x)].tiao==1) qi,sha(x,xia(x)),flag=1;
}
}
else if(v==4)
{
int y=find(x);
if(y!=0) qi,jd(x,y);
if(p[x].dead) return;
}
else if(v==5) qi,nanm(x);
else if(v==6) qi,wanj(x);
else if(v==8) qi,p[x].z=1;
else ;
}
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>s[0]; p[i].hp=4;
if(s[0]=="MP") p[i].q=1;
else if(s[0]=="ZP") p[i].q=2;
else p[i].q=3;
for(int j=0;j<=3;++j) cin>>s[0],napai(i,0);
}
for(int i=1;i<=m;++i) cin>>s[i];
while(1) for(int i=1;i<=n;++i) huihe(i);
return 0;
}