#include <bits/stdc++.h>
using namespace std;
struct Face {
vector<vector<string>> grid;
};
void rotateRight(Face &f) {
int n = f.grid.size();
vector<vector<string>> res(n, vector<string>(n));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
res[j][n - 1 - i] = f.grid[i][j];
f.grid = res;
}
void rotateLeft(Face &f) {
int n = f.grid.size();
vector<vector<string>> res(n, vector<string>(n));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
res[n - 1 - j][i] = f.grid[i][j];
f.grid = res;
}
bool isUniform(Face &f) {
string c = f.grid[0][0];
for (auto &r : f.grid)
for (auto &x : r)
if (x != c) return false;
return true;
}
bool anyFaceUniform(vector<Face> &cube) {
for (auto &f : cube)
if (isUniform(f)) return true;
return false;
}
void applyInstruction(vector<Face> &cube, const string &instr) {
stringstream ss(instr);
string a, b, c;
ss >> a;
if (a == "turn") {
ss >> b;
if (b == "left") rotateLeft(cube[3]); // front
else if (b == "right") rotateRight(cube[3]);
} else if (a == "rotate") {
ss >> b;
if (b == "front") rotateRight(cube[3]);
else if (b == "back") rotateRight(cube[1]);
else if (b == "left") rotateLeft(cube[4]);
else if (b == "right") rotateRight(cube[5]);
} else {
// side row/col move
ss >> b >> c;
if (a == "top") rotateRight(cube[2]);
else if (a == "base") rotateLeft(cube[0]);
else if (a == "front") rotateRight(cube[3]);
else if (a == "back") rotateLeft(cube[1]);
else if (a == "left") rotateRight(cube[4]);
else if (a == "right") rotateLeft(cube[5]);
}
}
bool isFaulty(vector<Face> &cube) {
unordered_map<string, int> freq;
for (auto &f : cube)
for (auto &r : f.grid)
for (auto &x : r)
freq[x]++;
int mn = INT_MAX, mx = INT_MIN;
for (auto &p : freq) {
mn = min(mn, p.second);
mx = max(mx, p.second);
}
return (mx - mn > 1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, K;
cin >> N >> K;
vector<Face> cube(6);
for (int f = 0; f < 6; ++f) {
cube[f].grid.resize(N, vector<string>(N));
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
cin >> cube[f].grid[i][j];
}
cin.ignore();
vector<string> instructions(K);
for (int i = 0; i < K; ++i) {
getline(cin, instructions[i]);
}
bool faulty = isFaulty(cube);
string extra = "";
bool found = false;
// Try skipping one instruction at a time
for (int skip = 0; skip < K; ++skip) {
vector<Face> temp = cube;
for (int i = 0; i < K; ++i)
if (i != skip)
applyInstruction(temp, instructions[i]);
if (anyFaceUniform(temp)) {
extra = instructions[skip];
found = true;
break;
}
}
if (faulty && found) {
cout << "Faulty\n" << extra << "\n";
} else if (!faulty && found) {
cout << extra << "\n";
} else {
cout << "Not Possible\n";
}
return 0;
}