#include #define f(i, s, k, l) for (ll i = s; i < k; i += l) #define for0(i, k) f(i, 0, k, 1) #define pl pair #define pb push_back #define vl vector #define vi vector #define sz(x) (ll)(x).size() using namespace std; using ll = long long; using ld = double; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); vector s(6); for0(i, 6) cin >> s[i]; swap(s[1], s.back()); vl endsWith(26, 1e9); for0(i, 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3) { char last = 'A'; ll tmp = i; ll turns = 0; for0(d, 8) { if (tmp % 3 == 0 || tmp % 3 == 1) { if (s[tmp % 3][d] < last) turns = 1e9; else { last = s[tmp % 3][d]; turns += (tmp % 3) * 2; if (last == 'Q') last = 'U'; } } else { char bestc = 'Z' + 1; for (ll k = 2; k < sz(s); k++) { if (s[k][d] >= last) bestc = min(bestc, s[k][d] == 'Q' ? 'U' : s[k][d]); } if (bestc <= 'Z') { turns++; last = bestc; } else turns = 1e9; } tmp /= 3; } endsWith[last - 'A'] = min(endsWith[last - 'A'], turns); } for0(i, sz(endsWith) - 1) endsWith[i + 1] = min(endsWith[i], endsWith[i + 1]); ll res = 1e9; for0(i, 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3) { char last = 'Z'; ll tmp = i; ll turns = 0; for (ll d = 15; d >= 8; d--) { if (tmp % 3 == 0 || tmp % 3 == 1) { if ((s[tmp % 3][d] == 'Q' ? 'U' : s[tmp % 3][d]) > last) turns = 1e9; else { last = s[tmp % 3][d]; turns += (tmp % 3) * 2; } } else { char bestc = 'A' - 1; for (ll k = 2; k < sz(s); k++) { if ((s[k][d] == 'Q' ? 'U' : s[k][d]) <= last) bestc = max(bestc, s[k][d]); } if (bestc >= 'A') { turns++; last = bestc; } else turns = 1e9; } tmp /= 3; } res = min(res, turns + endsWith[last - 'A']); } if (res > 1000) cout << "impossible" << endl; else cout << res << endl; }