#include <bits/stdc++.h>
using namespace std;
set<pair<char, char> > V;
char R[18][18], S[18][18];
int main(void) {
  int n, m;
  cin >> n >> m;
  bool test1 = (n >= 6 && m >= 3) || (n >= 3 && m >= 6);
  if (test1 == false) {
    cout << "No solution." << endl;
    return 0;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      string w;
      cin >> w;
      R[i][j] = w[0];
      S[i][j] = w[1];
      V.insert(pair<char, char>(R[i][j], S[i][j]));
    }
  }
  set<pair<char, char> > Q;
  char TR[13] = {'2', '3', '4', '5', '6', '7', '8',
                 '9', 'T', 'J', 'Q', 'K', 'A'};
  char TS[4] = {'C', 'D', 'H', 'S'};
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 13; j++) {
      if (V.find(pair<char, char>(TR[j], TS[i])) == V.end()) {
        Q.insert(pair<char, char>(TR[j], TS[i]));
      }
    }
  }
  int jk1r, jk1c, jk2r, jk2c;
  jk1r = jk1c = jk2r = jk2c = -1;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (R[i][j] == 'J' && S[i][j] == '1') {
        jk1r = i;
        jk1c = j;
      } else if (R[i][j] == 'J' && S[i][j] == '2') {
        jk2r = i;
        jk2c = j;
      }
    }
  for (int r1 = 0; r1 + 2 < n; r1++)
    for (int c1 = 0; c1 + 2 < m; c1++) {
      for (int r2 = 0; r2 + 2 < n; r2++)
        for (int c2 = 0; c2 + 2 < m; c2++) {
          bool test2 = (r2 <= r1 + 2) && (r1 <= r2 + 2) && (c2 <= c1 + 2) &&
                       (c1 <= c2 + 2);
          if (test2) continue;
          for (int jr1 = 0; jr1 < 13; jr1++)
            for (int js1 = 0; js1 < 4; js1++) {
              for (int jr2 = 0; jr2 < 13; jr2++)
                for (int js2 = 0; js2 < 4; js2++) {
                  char cr1 = TR[jr1], cr2 = TR[jr2], cs1 = TS[js1],
                       cs2 = TS[js2];
                  if (jr1 == jr2 && js1 == js2) continue;
                  if (Q.find(pair<char, char>(cr1, cs1)) == Q.end() ||
                      Q.find(pair<char, char>(cr2, cs2)) == Q.end())
                    continue;
                  if (jk1r != -1) {
                    R[jk1r][jk1c] = cr1;
                    S[jk1r][jk1c] = cs1;
                  }
                  if (jk2r != -1) {
                    R[jk2r][jk2c] = cr2;
                    S[jk2r][jk2c] = cs2;
                  }
                  bool ok1 = true;
                  for (int i = 0; i < 3; i++)
                    for (int j = 0; j < 3; j++) {
                      if (S[r1][c1] != S[r1 + i][c1 + j]) {
                        ok1 = false;
                        break;
                      }
                    }
                  bool ok2 = true;
                  bool used2[256];
                  memset(used2, false, sizeof(used2));
                  for (int i = 0; i < 3; i++)
                    for (int j = 0; j < 3; j++) {
                      if (used2[(int)R[r1 + i][c1 + j]]) {
                        ok2 = false;
                        break;
                      }
                      used2[(int)R[r1 + i][c1 + j]] = true;
                    }
                  bool ok3 = true;
                  for (int i = 0; i < 3; i++)
                    for (int j = 0; j < 3; j++) {
                      if (S[r2][c2] != S[r2 + i][c2 + j]) {
                        ok3 = false;
                        break;
                      }
                    }
                  bool ok4 = true;
                  bool used4[256];
                  memset(used4, false, sizeof(used4));
                  for (int i = 0; i < 3; i++)
                    for (int j = 0; j < 3; j++) {
                      if (used4[(int)R[r2 + i][c2 + j]]) {
                        ok4 = false;
                        break;
                      }
                      used4[(int)R[r2 + i][c2 + j]] = true;
                    }
                  if ((ok1 || ok2) && (ok3 || ok4)) {
                    cout << "Solution exists." << endl;
                    if (jk1r == -1 && jk2r == -1) {
                      cout << "There are no jokers." << endl;
                    } else if (jk1r != -1 && jk2r != -1) {
                      cout << "Replace J1 with " << R[jk1r][jk1c]
                           << S[jk1r][jk1c] << " and ";
                      cout << "J2 with " << R[jk2r][jk2c] << S[jk2r][jk2c]
                           << "." << endl;
                    } else if (jk1r != -1) {
                      cout << "Replace J1 with " << R[jk1r][jk1c]
                           << S[jk1r][jk1c] << "." << endl;
                    } else if (jk2r != -1) {
                      cout << "Replace J2 with " << R[jk2r][jk2c]
                           << S[jk2r][jk2c] << "." << endl;
                    }
                    cout << "Put the first square to (" << r1 + 1 << ", "
                         << c1 + 1 << ")." << endl;
                    cout << "Put the second square to (" << r2 + 1 << ", "
                         << c2 + 1 << ")." << endl;
                    return 0;
                  }
                }
            }
        }
    }
  cout << "No solution." << endl;
  return 0;
}
