#include<bits/stdc++.h>
using namespace std;
#define attack pppppp
#define what ifp
#define whel ifp
#define whno ifp
#define whre ifp
#define ENT int b=0;for(int j=1;b!=n;j=max(1,(j+1)%(n+1)),b++)
#define LNT int kk=0;for(int i=max(1,(x+1)%(n+1));kk!=n;i=max(1,(i+1)%(n+1)),kk++)
int nowp[12][2020],pdaw[2020],head[12],tail[12],nowpdaw=0,passio[12],jum[12],jow[12],zhuge[12],lif[12],blood[12];
int attac[12],elude[12],rescu[12],noeff[12],ifp[12][2020];//what[12][2020],whel[12][2020],whre[12][2020],whno[12][2020],
//杀1,闪2,桃3,决斗4,南蛮5,万箭6,无懈7,诸葛8
//主公1,忠臣2,反贼3,类反4
bool ifhavef;
int n,m,whilend=0;
inline int read()
{
char ch=getchar();
while(ch<'A'||ch>'Z')ch=getchar();
if(ch=='M'){getchar();return -1;}
if(ch=='Z'){ch=getchar();if(ch=='P')return -2;else return 8;}
if(ch=='F'){ch=getchar();if(ch=='P')return -3;else return 4;}
if(ch=='K')return 1;
if(ch=='D')return 2;
if(ch=='P')return 3;
if(ch=='N')return 5;
if(ch=='W')return 6;
if(ch=='J')return 7;
}
void init()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
head[i]=1;tail[i]=4;jum[i]=0;jow[i]=0;zhuge[i]=0;lif[i]=1;blood[i]=4;
attac[i]=elude[i]=rescu[i]=noeff[i]=0;
}
for(int i=1;i<=n;i++)
{
passio[i]=abs(read());
for(int j=1;j<=4;j++)
{
nowp[i][j]=read();
if(nowp[i][j]==1)attac[i]++;
if(nowp[i][j]==2)elude[i]++;
if(nowp[i][j]==3)rescu[i]++;
if(nowp[i][j]==7)noeff[i]++;
ifp[i][j]=1;
}
}
for(int i=1;i<=m;i++)
pdaw[i]=read();
}
inline void findjow(int x)
{
if(passio[x]==1)
{
for(int i=2;i<=n;i++)
if(lif[i])
if(jum[i]==3||jum[i]==4)
{
jow[x]=i;
return;
}
}
if(passio[x]==2)
{
LNT
if(lif[i])
if(jum[i]==3)
{
jow[x]=i;
return;
}
}
if(passio[x]==3)
{
LNT
if(lif[i])
if(jum[i]==2)
{
jow[x]=i;
return;
}
}
jow[x]=0;return;
}
inline void findjump(int x,int y)
{
if(x!=1)
{
if(jum[y]!=3)
jum[x]=3;
else
{
if(jum[x]==4)
{
jum[x]=2;
findjow(1);
}jum[x]=2;
}
}
}
inline void getp(int x)
{
nowpdaw=min(m,nowpdaw+1);
nowp[x][++tail[x]]=pdaw[nowpdaw];
if(nowp[x][tail[x]]==1)
attac[x]++,what[x][tail[x]]=1;
if(nowp[x][tail[x]]==2)
elude[x]++,whel[x][tail[x]]=1;
if(nowp[x][tail[x]]==3)
rescu[x]++,whre[x][tail[x]]=1;
if(nowp[x][tail[x]]==7)
noeff[x]++,whno[x][tail[x]]=1;
ifp[x][tail[x]]=1;
}
inline void loseblood(int from,int x)
{
blood[x]--;
if(blood[x]==0)
{
if(rescu[x]==0)
{
lif[x]=0;if(x==1){whilend=1;return;}
findjow(from);
//award or disagree!!!
int mark=0;
for(int i=1;i<=n;i++)
if(lif[i]==1&&passio[i]==3)mark=1;
if(mark==0){whilend=1;return;}
if(passio[x]==3){getp(from);getp(from);getp(from);}
if(passio[x]==2&&from==1)head[1]=tail[1]+1,zhuge[1]=0,attac[1]=0,elude[1]=0,rescu[1]=0;
}
else
{
rescu[x]--;
for(int i=head[x];i<=tail[x];i++)
{
if(whre[x][i]==1)
{
whre[x][i]=0;
blood[x]=1;
return;
}
}
}
}
}
inline void attack(int x,int y,int kind)
{
if(kind==1)
{
if(jum[x]==0)findjump(x,y);
if(elude[y]>0)
{
elude[y]--;
for(int i=head[y];i<=tail[y];i++)
{
if(whel[y][i]==1)
{
whel[y][i]=0;
break;
}
}
}
else loseblood(x,y);
}
if(kind==4)
{
ifhavef=0;
if(jum[x]==0)findjump(x,y);
LNT
{
if(noeff[i]>0)
{
if(jum[y]==2||y==1)
{
if(passio[i]==2||i==1)
{
if(i!=1)jum[i]=2;
ifhavef=1;
attack(i,2,7);
}
}
if(jum[y]==3)
{
if(passio[i]==3)
{
jum[i]=3;
ifhavef=1;
attack(i,3,7);
}
}
}
}
if(ifhavef==1)return;
if(x==1&&passio[y]==2) {loseblood(x,y);return;}
else
{
int i=0;
while(1)
{
i++;
if(i%2==1)
{
if(attac[y]>0)
{
attac[y]--;
for(int i=head[y];i<=tail[y];i++)
{
if(what[y][i]==1)
{
what[y][i]=0;
break;
}
}
}
else {loseblood(x,y);return;}
}
if(i%2==0)
{
if(attac[x]>0)
{
attac[x]--;
for(int i=head[x];i<=tail[x];i++)
{
if(what[x][i]==1)
{
what[x][i]=0;
break;
}
}
}
else {loseblood(y,x);return;}
}
}
}
}
if(kind==5)
{
LNT
{
if(x==i)continue;
ifhavef=0;
ENT
{
if(noeff[j]>0)
{
if(jum[i]==2||i==1)
{
if(passio[j]==2||j==1)
{
if(j!=1)jum[j]=2;
ifhavef=1;
attack(j,2,7);
}
}
if(jum[i]==3)
{
if(passio[j]==3)
{
jum[j]=3;
ifhavef=1;
attack(j,3,7);
}
}
}
}
if(ifhavef)continue;
else
{
if(attac[y]>0)
{
attac[y]--;
for(int i=head[y];i<=tail[y];i++)
{
if(what[y][i]==1)
{
what[y][i]=0;
break;
}
}
}
else
{
if(i==1&&jum[x]==0)jum[x]=4;
loseblood(x,i);
}
}
}
}
if(kind==6)
{
LNT
{
if(x==i)continue;
ifhavef=0;
ENT
{
if(noeff[j]>0)
{
if(jum[i]==2||i==1)
{
if(passio[j]==2||j==1)
{
if(j!=1)jum[j]=2;
ifhavef=1;
attack(j,2,7);
}
}
if(jum[i]==3)
{
if(passio[j]==3)
{
jum[j]=3;
ifhavef=1;
attack(j,3,7);
}
}
}
}
if(ifhavef)continue;
else
{
if(elude[y]>0)
{
elude[y]--;
for(int i=head[y];i<=tail[y];i++)
{
if(whel[y][i]==1)
{
whel[y][i]=0;
break;
}
}
}
else
{
if(i==1&&jum[x]==0)jum[x]=4;
loseblood(x,i);
}
}
}
}
if(kind==7)
{
LNT
{
if(noeff[i]>0)
{
if(jum[x]==2||x==1)
{
if(passio[i]==3)
{
jum[i]=3;
ifhavef=(ifhavef+1)%2;
noeff[i]--;
for(int j=head[i];j<=tail[i];i++)
{
if(whno[i][j]==1)
{
whno[i][j]=0;
break;
}
}
attack(i,3,7);
}
}
if(jum[x]==3)
{
if(passio[i]==2||i==1)
{
if(i!=1)jum[i]=2;
ifhavef=(ifhavef+1)%2;
noeff[i]--;
for(int j=head[i];j<=tail[i];i++)
{
if(whno[i][j]==1)
{
whno[i][j]=0;
break;
}
}
attack(i,2,7);
}
}
}
}
}
}
inline int dis(int x,int y)
{
int ans=0;
for(int i=x;i!=y;i=max(1,(i+1)%(n+1)))
if(lif[i])ans++;
return ans;
}
inline void outn(int x)
{
bool sha=0;
getp(x);getp(x);findjow(x);
for(int i=head[x];i<=tail[x]&&head[x]<=tail[x];i++)
{
if(whilend==1)return;
bool ifpai=0;
if(ifp[x][i]==1)
{
if(nowp[x][i]==1&&sha==0)
{
if(jow[x]!=0)
{if(dis(x,jow[x])<=1)
attack(x,jow[x],1);
ifp[x][i]=0;
if(!zhuge[x])sha=1;
ifpai=1;
}
else if(passio[x]==3&&dis(x,1)<=1)
{
attack(x,1,1);
ifp[x][i]=0;
if(!zhuge[x])sha=1;
ifpai=1;
}
}
if(nowp[x][i]==3&&blood[x]<4)
{
blood[x]++;
ifp[x][i]=0;
ifpai=1;
}
if((nowp[x][i]==4&&jow[x]!=0)||nowp[x][i]==5||nowp[x][i]==6)
{
if(nowp[x][i]==4)
{
if(passio[x]==3)
{
attack(x,1,nowp[x][i]);
ifp[x][i]=0;
ifpai=1;
}
else if(jow[x]!=0)
{
attack(x,jow[x],nowp[x][i]);
ifp[x][i]=0;
ifpai=1;
}
}
else
{
attack(x,jow[x],nowp[x][i]);
ifp[x][i]=0;
ifpai=1;
}
}
if(nowp[x][i]==8)
{
zhuge[x]=1;sha=0;i=head[x];ifp[x][i]=0;
ifpai=1;
}
// cout<<nowp[x][i]<<" ";
}
if(i==head[x]&&ifpai==1)head[x]++;
}
// cout<<endl;
}
void solve()
{
int nowx=1;
while(!whilend)
{
if(lif[nowx])
outn(nowx);
nowx=max(1,(nowx+1)%(n+1));
if(nowx==3)
nowx=3;
}
}
void print()
{
if(lif[1])cout<<"MP"<<endl;else cout<<"FP"<<endl;
for(int i=1;i<=n;i++)
{
if(lif[i])
{
for(int j=head[i];j<=tail[i];j++)
{
if(ifp[i][j])
{
if(nowp[i][j]==1)cout<<"K";
if(nowp[i][j]==2)cout<<"D";
if(nowp[i][j]==3)cout<<"P";
if(nowp[i][j]==4)cout<<"F";
if(nowp[i][j]==5)cout<<"N";
if(nowp[i][j]==6)cout<<"W";
if(nowp[i][j]==7)cout<<"J";
if(nowp[i][j]==8)cout<<"Z";
cout<<" ";
}
}
}
else cout<<"DEAD";
cout<<endl;
}
}
int main()
{
init();
// for(int i=1;i<=n;i++)
// for(int j=1;j<=4;j++)cout<<ifp[i][j]<<" ";
solve();
print();
return 0;
}
真的有人会帮忙吗...