#include<bits/stdc++.h>
using namespace std;
int n,m,tot,f[15],pre[15],nxt[15],cnt[15];
bool flg[15],flg1[15],flg2[15],flg3[15],flg4[15];
char c[2005];
deque<char> q[15];
inline void print(){
bool p=1;
for(int i=1;i<=n;++i)
if(f[i]==1&&flg[i]){
puts("FP");
p=0;
break;
}
if(p)
puts("MP");
for(int i=1;i<=n;++i)
if(flg[i])
puts("DEAD");
else{
for(int j=0,len=q[i].size();j<len;++j)
putchar(q[i][j]),putchar(' ');
puts("");
}
}
inline bool check(){
for(int i=1;i<=n;++i)
if(f[i]==1&&flg[i]){
print();
return 1;
}
for(int i=1;i<=n;++i)
if(f[i]==3&&!flg[i])
return 0;
print();
return 1;
}
inline void get(int x){
q[x].push_back(c[tot]);
if(tot!=m)
++tot;
}
inline bool find(int x,char c){
for(int i=0,len=q[x].size();i<len;++i)
if(q[x][i]==c){
q[x].erase(q[x].begin()+i);
return 1;
}
return 0;
}
inline void del(int x){
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
}
void work(int x){
if(check())
return;
get(x),get(x);
bool chk=0,u=1;
while(u){
u=0;
for(int i=0;i<q[x].size();++i)
if(q[x][i]=='P'){
if(cnt[x]!=4)
++cnt[x];
q[x].erase(q[x].begin()+i);
--i;
} else if(q[x][i]=='K'){
if(!flg4[x]&&chk)
continue;
if(f[x]==1){
if(flg1[nxt[x]]||flg3[nxt[x]]){
q[x].erase(q[x].begin()+i);
--i;
chk=1;
if(!find(nxt[x],'D'))
--cnt[nxt[x]];
if(!cnt[nxt[x]]){
if(find(nxt[x],'P'))
++cnt[nxt[x]];
else{
flg[nxt[x]]=1;
if(check())
return;
if(f[nxt[x]]==2)
q[x].clear();
else
get(x),get(x),get(x),u=1;
del(nxt[x]);
}
}
}
} else if(f[x]==2){
if(flg3[nxt[x]]){
q[x].erase(q[x].begin()+i);
--i;
chk=1;
flg2[x]=1,flg1[x]=0;
if(!find(nxt[x],'D'))
--cnt[nxt[x]];
if(!cnt[nxt[x]]){
if(find(nxt[x],'P'))
++cnt[nxt[x]];
else{
flg[nxt[x]]=1;
if(check())
return;
get(x),get(x),get(x),u=1;
del(nxt[x]);
}
}
}
} else{
if(flg2[nxt[x]]){
q[x].erase(q[x].begin()+i);
--i;
chk=1;
flg3[x]=1,flg1[x]=0;
if(!find(nxt[x],'D'))
--cnt[nxt[x]];
if(!cnt[nxt[x]]){
if(find(nxt[x],'P'))
++cnt[nxt[x]];
else{
flg[nxt[x]]=1;
if(check())
return;
del(nxt[x]);
}
}
}
}
} else if(q[x][i]=='Z'){
q[x].erase(q[x].begin()+i);
--i;
flg4[x]=1;
} else if(q[x][i]=='F'){
int t=nxt[x];
while(t!=x){
if(f[x]==1){
if(flg1[t]||flg3[t]){
q[x].erase(q[x].begin()+i);
--i;
if(f[t]==2){
--cnt[t];
if(!cnt[t]){
if(find(t,'P'))
++cnt[t];
else{
flg[t]=1;
if(check())
return;
q[x].clear();
del(t);
}
}
} else{
bool p=1;
int T=nxt[t];
if((flg2[t]||flg3[t])&&find(t,'J'))
break;
while(T!=t){
if(f[T]==3&&find(T,'J')){
p=0;
flg3[T]=1,flg1[T]=0;
break;
}
T=nxt[T];
}
if(!p)
break;
while(find(t,'K')){
if(!find(x,'K')){
p=0;
break;
}
}
if(p){
--cnt[t];
if(!cnt[t]){
if(find(t,'P'))
++cnt[t];
else{
flg[t]=1;
if(check())
return;
get(x),get(x),get(x),u=1;
del(t);
}
}
} else{
--cnt[x];
if(!cnt[x]){
if(find(x,'P'))
++cnt[x];
else{
flg[x]=1;
if(check())
return;
del(x);
}
}
}
}
break;
}
} else if(f[x]==2){
if(flg3[t]){
q[x].erase(q[x].begin()+i);
--i;
flg2[x]=1,flg1[x]=0;
if(find(t,'J'))
break;
bool p=1;
int T=nxt[t];
while(T!=t){
if(f[T]==3&&find(T,'J')){
p=0;
flg3[T]=1,flg1[T]=0;
break;
}
T=nxt[T];
}
if(!p)
break;
while(find(t,'K')){
if(!find(x,'K')){
p=0;
break;
}
}
if(p){
--cnt[t];
if(!cnt[t]){
if(find(t,'P'))
++cnt[t];
else{
flg[t]=1;
if(check())
return;
get(x),get(x),get(x),u=1;
del(t);
}
}
} else{
--cnt[x];
if(!cnt[x]){
if(find(x,'P'))
++cnt[x];
else{
flg[x]=0;
if(check())
return;
del(x);
}
}
}
break;
}
} else{
if(flg2[t]){
q[x].erase(q[x].begin()+i);
--i;
flg3[x]=1,flg1[x]=0;
bool p=1;
int T=nxt[t];
if(find(t,'J'))
break;
while(T!=t){
if((f[T]==2||f[T]==1)&&find(T,'J')){
p=0;
flg2[T]=1,flg1[T]=0;
break;
}
T=nxt[T];
}
if(!p)
break;
while(find(t,'K')){
if(!find(x,'K')){
p=0;
break;
}
}
if(p){
--cnt[t];
if(!cnt[t]){
if(find(t,'P'))
++cnt[t];
else{
flg[t]=1;
if(check())
return;
del(t);
}
}
} else{
--cnt[x];
if(!cnt[x]){
if(find(x,'P'))
++cnt[x];
else{
flg[x]=1;
if(check())
return;
get(t),get(t),get(t),u=1;
del(x);
}
}
}
break;
}
}
t=nxt[t];
}
} else if(q[x][i]=='N'){
q[x].erase(q[x].begin()+i);
--i;
int t=nxt[x];
while(t!=x){
if(!find(t,'K')){
if((flg2[t]||flg3[t])&&find(t,'J'))
continue;
int T=nxt[t];
bool p=0;
while(T!=t){
if(f[T]==3&&flg3[t]&&find(T,'J')){
flg3[T]=1,flg1[T]=0;
p=1;
break;
}
if((f[T]==1||f[T]==2)&&flg2[t]&&find(T,'J')){
flg2[T]=1,flg1[T]=0;
p=1;
break;
}
T=nxt[T];
}
if(p)
continue;
--cnt[t];
if(f[t]==1&&!flg2[x]&&!flg3[x])
flg1[x]=1;
if(!cnt[t]){
if(find(t,'P'))
++cnt[t];
else{
flg[t]=1;
if(check())
return;
del(t);
if(f[t]==3)
get(x),get(x),get(x),u=1;
else if(f[t]==2&&f[x]==1)
q[x].clear();
}
}
}
t=nxt[t];
}
} else if(q[x][i]=='W'){
q[x].erase(q[x].begin()+i);
--i;
u=1;
int t=nxt[x];
while(t!=x){
if(!find(t,'D')){
if((flg2[t]||flg3[t])&&find(t,'J'))
continue;
int T=nxt[t];
bool p=0;
while(T!=t){
if(f[T]==3&&flg3[t]&&find(T,'J')){
flg3[T]=1,flg1[T]=0;
p=1;
break;
}
if((f[T]==1||f[T]==2)&&flg2[t]&&find(T,'J')){
flg2[T]=1,flg1[T]=0;
p=1;
break;
}
T=nxt[T];
}
if(p)
continue;
--cnt[t];
if(f[t]==1&&!flg2[x]&&!flg3[x])
flg1[x]=1;
if(!cnt[t]){
if(find(t,'P'))
++cnt[t];
else{
flg[t]=1;
if(check())
return;
del(t);
if(f[t]==3)
get(x),get(x),get(x),u=1;
else if(f[t]==2&&f[x]==1)
q[x].clear();
}
}
}
t=nxt[t];
}
}
}
work(nxt[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
nxt[i]=i+1,pre[i]=i-1;
string s;
cin>>s;
if(s=="MP")
f[i]=1,flg2[i]=1;
else if(s=="ZP")
f[i]=2;
else if(s=="FP")
f[i]=3;
for(int j=1;j<=4;++j){
cin>>c[0];
q[i].push_back(c[0]);
}
cnt[i]=4;
}
for(int i=1;i<=m;++i)
cin>>c[i];
nxt[n]=tot=1,pre[1]=n;
work(1);
return 0;
}