#include using namespace std; const int DIM = 25; vector> v[DIM]; int n; int val[DIM]; vector s; char tp[4][4] = { 'F', 'F', 'F', 'F', 'F', 'S', 'S', 'S', 'F', 'S', 'S', 'S', 'F', 'S', 'S', 'F' }; bool check(int k, vector &vs) { for (int i = 0; i < k; ++i) { auto it = vs[i]; for (int j = i + 1; j < k; ++j) { auto it2 = vs[j]; if (s[it][it2] != '?' && s[it][it2] != tp[val[it]][val[it2]]) { return false; } } } return true; } bool good = false; int rest; int cnt[4]; void back(int k, vector &vs) { if (!check(k, vs)) return; if (good) return; if (k == vs.size()) { good = true; return; } for (int x = 0; x < 4; ++x) { ++cnt[x]; val[vs[k]] = x; if (cnt[x] <= (n + 3) / 4) { if (cnt[x] > n / 4) { --rest; } if (rest >= 0) { back(k + 1, vs); if (good) return; } if (cnt[x] > n / 4) { ++rest; } } --cnt[x]; } } int main() { cin.tie(NULL); ios::sync_with_stdio(false); cin >> n; vector vs; s.resize(n + 1); for (int i = 1; i <= n; ++i) { cin >> s[i]; bool found = false; s[i] = " " + s[i]; for (int j = 1; j <= n; ++j) { if (s[i][j] == '.') continue; if (s[i][j] == 'F' || s[i][j] == 'S') { found = true; } } if (found) vs.push_back(i); } rest = n % 4; back(0, vs); vector nr(4, 0); vector ap(n + 1, 0); for (auto it : vs) { ++nr[val[it]]; ap[it] = 1; } for (int i = 1; i <= n; ++i) { if (ap[i]) continue; for (int j = 0; j < 4; ++j) { if (nr[j] < n / 4 || (nr[j] == n / 4 && rest > 0)) { if (nr[j] == n / 4) rest--; nr[j] += 1; val[i] = j; break; } } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (i == j) s[i][j] = '.'; else s[i][j] = tp[val[i]][val[j]]; cout << s[i][j]; } cout << endl; } return 0; }