#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;
}