#include <iostream>
#include <vector>
#include <string>
using namespace std;
void PrintGrille(const vector<vector<char>> & grille) {
for (size_t r = 0; r < grille.size(); ++r) {
for (size_t c = 0; c < grille.size(); ++c) {
cout << grille[r][c];
}
cout << endl;
}
cout << endl;
}
vector<vector<char>> RotateGrille(const vector<vector<char>> & grille) {
auto rv = grille;
size_t cols = grille.size() -1;
for(size_t r =0; r < grille.size(); ++r) {
for (size_t c = 0; c < grille.size(); ++c) {
rv[c][cols-r] = grille[r][c];
}
}
return rv;
}
bool DecodeString(string line, size_t & currentPos, string & plainText,
string & covered, const vector<vector<char>> & grille) {
for(size_t r =0; r < grille.size(); ++r) {
for (size_t c = 0; c < grille.size(); ++c) {
if (grille[r][c] == '.') {
size_t pos = r*grille.size() + c;
plainText[pos] = line[currentPos];
if (covered[pos] == 'X') {
cout << "invalid grille" << endl;
return false;
} else {
covered[pos] = 'X';
}
currentPos++;
}
}
}
return true;
}
int main() {
size_t size;
cin >> size;
if (size % 2 != 0) {
cout << "invalid grille" << endl;
return 0;
}
string codeWord;
vector<vector<char>> grille(size, vector<char>(size));
for(size_t r =0; r < size; ++r) {
for(size_t c = 0; c < size; ++c) {
cin >> grille[r][c];
}
}
cin >> codeWord;
size_t currentPos = 0;
string covered = codeWord;
string plainText = codeWord;
for(size_t i = 0; i < 4; ++i) {
if(not DecodeString(codeWord, currentPos, plainText, covered, grille)) {
return 0;
}
grille = RotateGrille(grille);
}
covered = covered.substr(0,size*size);
for (auto x: covered) {
if (x != 'X') {
cout << "invalid grille" << endl;
return 0;
}
}
cout << plainText << endl;
return 0;
}