#include <bits/stdc++.h>
#include <bits/extc++.h>
#define unknown 0
#define TZ 1
#define TF 2
#define LF 3
#define MP 4
struct pig {
int hp, Kcnt, Dcnt, Pcnt, Jcnt, nxt, pre, glbid, Ktarget, Ftarget;
bool isalive, isweapon;
std::string id;
std::vector<char> card;
} pigs[11];
std::queue<char> cards;
int pigcnt, fpcnt, cardscnt, ptr;
std::string result;
void fold(int target, char card) {
pigs[target].card.erase(std::find(pigs[target].card.begin(), pigs[target].card.end(), card));
}
void getcardformcards(int times, int target) {
while (times--) {
pigs[target].card.push_back(cards.front());
if (cards.front() == 'D')pigs[target].Dcnt++;
if (cards.front() == 'K')pigs[target].Kcnt++;
if (cards.front() == 'P')pigs[target].Pcnt++;
if (cards.front() == 'J')pigs[target].Jcnt++;
if (cards.size() > 1)cards.pop();
}
}
void initcards(int target) {
char tmp;
for (int t = 1; t <= 4; t++) {
std::cin >> tmp, pigs[target].card.push_back(tmp);
if (tmp == 'D')pigs[target].Dcnt++;
if (tmp == 'K')pigs[target].Kcnt++;
if (tmp == 'P')pigs[target].Pcnt++;
if (tmp == 'J')pigs[target].Jcnt++;
}
}
void outputresult() {
std::cout << result << '\n';
for (int i = 1; i <= pigcnt; i++) {
if (!pigs[i].isalive)std::cout << "DEAD";
else if (!pigs[i].card.empty())for (auto i : pigs[i].card)std::cout << i << " ";
std::cout << "\n";
}
}
void clearcard(int target) {
pigs[target].isweapon = false, pigs[target].Dcnt = pigs[target].Kcnt = pigs[target].Pcnt = pigs[target].Jcnt = 0;
pigs[target].card.clear();
}
void havebeendead(int target) {
pigs[target].isalive = false, clearcard(target);
pigs[pigs[target].nxt].pre = pigs[target].pre, pigs[pigs[target].pre].nxt = pigs[target].nxt;
if (pigs[target].id == "MP") result = "FP", outputresult(), exit(0);
if (pigs[target].id == "FP" && --fpcnt == 1)outputresult(), exit(0);
}
void dying(int pigx, int target) {
if (pigs[target].Pcnt)pigs[target].Pcnt--, fold(target, 'P'), pigs[target].hp++;
else {
havebeendead(target);
if (pigs[pigx].id == "MP" && pigs[target].id == "ZP")clearcard(pigx);
else if (pigs[target].id == "FP")getcardformcards(3, pigx);
}
}
void K(int pigx, int target) {
if (pigs[pigx].glbid == unknown || pigs[pigx].glbid == LF)pigs[pigx].glbid = pigs[target].glbid == TZ ? TF : TZ;
if (pigs[target].Dcnt)pigs[target].Dcnt--, fold(target, 'D');
else if (--pigs[target].hp <= 0)dying(pigx, target);
}
void init(int target) {
std::string type;
std::cin >> type;
if (type == "MP")pigs[target].id = "MP", pigs[target].glbid = MP;
if (type == "ZP")pigs[target].id = "ZP";
if (type == "FP")pigs[target].id = "FP", fpcnt++, pigs[target].Ktarget = 1;
initcards(target);
pigs[target].hp = 4, pigs[target].isalive = true;
if (target == 1)pigs[target].nxt = 2, pigs[target].pre = pigcnt;
if (target == pigcnt)pigs[target].nxt = 1, pigs[target].pre = pigcnt - 1;
pigs[target].nxt = target + 1, pigs[target].pre = target - 1;
}
bool isover() {
if (pigs[1].isalive = false) {result = "FP"; return true;}
if (fpcnt == 0) {result = "MP"; return true;}
return false;
}
int gettarget(int target, std::string type) {
if (type == "MP")return (pigs[pigs[target].nxt].glbid == TF || pigs[pigs[target].nxt].glbid == LF ? pigs[target].nxt : 0);
if (type == "ZP")return (pigs[pigs[target].nxt].glbid == TF ? pigs[target].nxt : 0);
if (type == "FP")return (pigs[pigs[target].nxt].glbid == TZ ? pigs[target].nxt : 0);
}
void updateK(int target) {
if (pigs[target].id == "MP")pigs[target].Ktarget = gettarget(target, "MP");
if (pigs[target].id == "ZP")pigs[target].Ktarget = gettarget(target, "ZP");
if (pigs[target].id == "FP")pigs[target].Ktarget = gettarget(target, "FP");
}
bool checkFtarget(int from, int to) {
return ((from == 1 && (pigs[to].glbid = TF || pigs[to].glbid == LF)) || (pigs[from].glbid == TZ && pigs[to].glbid == TF));
}
void updateF(int target) {
for (int i = pigs[target].nxt; i != target; i = pigs[i].nxt)if (checkFtarget(target, i))return void(pigs[target].Ftarget = i);
return void(pigs[target].Ftarget = 0);
}
bool askforJtoprotect(int pigx, int ident) {
if (ident == unknown || ident == LF)return false;
for (int i = pigx; i; i = pigs[i].nxt) {
if (pigs[i].Jcnt) {
if (ident == TZ && (pigs[i].id == "MP" || pigs[i].id == "ZP")) {
fold(i, 'J'), pigs[i].Jcnt--;
if (pigs[i].glbid == unknown || pigs[i].glbid == LF)pigs[i].glbid = TZ;
return !askforJtoprotect(i, TF);
} else if (ident == TF && pigs[i].id == "FP") {
fold(i, 'J'), pigs[i].Jcnt--;
if (pigs[i].glbid == unknown || pigs[i].glbid == LF)pigs[i].glbid = TF;
return askforJtoprotect(i, TZ);
}
if (i == pigs[pigx].pre)return false;
}
}
}
void F(int pigx, int target) {
if (pigs[pigx].glbid == unknown || pigs[pigx].glbid == LF)pigs[pigx].glbid = (pigs[target].glbid == TZ ? TF : TZ);
if (askforJtoprotect(pigx, pigs[target].glbid))return;
if (pigs[pigx].id == "MP" && pigs[target].id == "ZP") {
if (--pigs[target].hp <= 0)dying(pigx, target);
return;
}
int pointer = target;
while (pigs[pointer].Kcnt)fold(pointer, 'K'), pigs[pointer].Kcnt--, pointer = (pointer == pigx ? target : pigx);
if (--pigs[pointer].hp <= 0)dying((pointer == target ? pigx : target), pointer);
}
void N_W(int pigx, char type) {
for (int i = pigs[pigx].nxt; i != pigx; i = pigs[i].nxt) {
if (!askforJtoprotect(pigx, pigs[i].glbid)) {
if (type == 'N') {
if (pigs[i].Kcnt)fold(i, 'K'), pigs[i].Kcnt--;
if (pigs[i].id == "MP" && pigs[pigx].glbid == unknown)pigs[pigx].glbid = LF;
else if (--pigs[i].hp <= 0)dying(pigx, i);
}
if (type == 'W') {
if (pigs[i].Kcnt)fold(i, 'D'), pigs[i].Kcnt--;
if (pigs[i].id == "MP" && pigs[pigx].glbid == unknown)pigs[pigx].glbid = LF;
else if (--pigs[i].hp <= 0)dying(pigx, i);
}
}
}
}
void sol(int target) {
getcardformcards(2, target);
int usedKtimes = 0;
for (int idx = 0; idx < pigs[target].card.size(); idx++) {
char i = pigs[target].card[idx];
if (i == 'Z')fold(target, 'Z'), pigs[target].isweapon = true, idx = 0;
if (i == 'F') {
if (pigs[target].id != "FP")updateF(target);
if (pigs[target].Ftarget != 0)fold(target, 'F'), F(target, pigs[target].Ftarget);
if (!pigs[target].isalive)return;
}
if (i == 'K' && (usedKtimes == 0 || pigs[target].isweapon))updateK(target), fold(target, 'K'), K(target, pigs[target].Ktarget), usedKtimes++, pigs[target].Kcnt--, idx = 0;
if (i == 'P' && pigs[target].hp < 4)fold(target, 'P'), pigs[target].Pcnt--, pigs[target].hp++, idx--;
if (i == 'N')fold(target, 'N'), N_W(target, 'N'), idx = 0;
if (i == 'W')fold(target, 'W'), N_W(target, 'W'), idx = 0;
}
}
char c;
signed main() {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
std::cin >> pigcnt >> cardscnt, ptr = 1;
for (int i = 1; i <= pigcnt; i++)init(i);
while (cardscnt--)std::cin >> c, cards.push(c);
while (!isover())sol(ptr), ptr = pigs[ptr].nxt;
return outputresult(), 0;
}