#include <bits/stdc++.h>
using namespace std;
string A[18][18], s;
int n, m, U[101], us, J[3][3];
bool B[1001];
int r1, c1, r2, c2, size;
int tonum(char ch) {
  if (ch == 'C') return 1;
  if (ch == 'D') return 2;
  if (ch == 'H') return 3;
  if (ch == 'S') return 4;
  if (ch == 'T') return 8;
  if (ch == 'J') return 9;
  if (ch == 'Q') return 10;
  if (ch == 'K') return 11;
  if (ch == 'A') return 12;
  return (int)ch - 50;
}
inline bool inside(int a, int b, int c) {
  if (b > c) swap(b, c);
  return (b <= a && a <= c);
}
inline bool ff(int r, int c) {
  bool B[13];
  for (int i = 0; i <= 12; i++) B[i] = false;
  for (int i = r; i <= r + 2; i++)
    for (int j = c; j <= c + 2; j++) {
      if (B[tonum(A[i][j][0])]) return false;
      B[tonum(A[i][j][0])] = true;
    }
  return true;
}
inline bool check() {
  for (int i = 1; i <= size; i++)
    for (int j = i + 1; j <= size; j++) {
      r1 = (i % m) ? i / m + 1 : i / m;
      c1 = (i % m) ? (i % m) : m;
      r2 = (j % m) ? j / m + 1 : j / m;
      c2 = (j % m) ? (j % m) : m;
      if (!(inside(r2, r1, r1 + 2) && inside(c2, c1, c1 + 2)) &&
          !(inside(r2, r1, r1 + 2) && inside(c2 + 2, c1, c1 + 2)) &&
          inside(r1 + 2, 1, n) && inside(r2 + 2, 1, n) &&
          inside(c1 + 2, 1, m) && inside(c2 + 2, 1, m)) {
        if (ff(r1, c1) && ff(r2, c2)) return true;
      }
    }
  return false;
}
char torank(int k) {
  int r = (k % 4) ? k / 4 + 1 : k / 4;
  if (r <= 8) return (char)(r + 49);
  if (r == 9) return 'T';
  if (r == 10) return 'J';
  if (r == 11) return 'Q';
  if (r == 12) return 'K';
  if (r == 13) return 'A';
}
char tosuit(int k) {
  int r = k % 4;
  if (r == 0) return 'S';
  if (r == 1) return 'C';
  if (r == 2) return 'D';
  if (r == 3) return 'H';
}
inline bool replacee(int j, int k) {
  if (J[j][1] == 0) return false;
  A[J[j][1]][J[j][2]][0] = torank(k);
  A[J[j][1]][J[j][2]][1] = tosuit(k);
  return true;
}
string print(int k) {
  char A[3];
  A[0] = torank(k);
  A[1] = tosuit(k);
  A[2] = '\0';
  string str(A);
  return str;
}
void printt() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) cout << A[i][j][0] << A[i][j][1] << " ";
    cout << endl;
  }
  cout << endl;
}
int main() {
  bool rep1, rep2;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      cin >> s;
      A[i][j].assign(s);
      if (s[0] == 'J') {
        if (s[1] == '1') {
          J[1][1] = i;
          J[1][2] = j;
        } else if (s[1] == '2') {
          J[2][1] = i;
          J[2][2] = j;
        }
      }
      B[tonum(s[0]) * 4 + tonum(s[1])] = true;
    }
  size = n * m;
  for (int i = 1; i <= 52; i++)
    if (!B[i]) U[us++] = i;
  for (int i = 0; i < us; i++)
    for (int j = 0; j < us; j++)
      if (i != j) {
        rep1 = replacee(1, U[i]);
        rep2 = replacee(2, U[j]);
        if (check()) {
          cout << "Solution exists." << endl;
          if (!rep1 && !rep2)
            cout << "There are no jokers." << endl;
          else if (rep1 && rep2)
            cout << "Replace J1 with " << print(U[i]) << " and J2 with "
                 << print(U[j]) << "." << endl;
          else if (rep1)
            cout << "Replace J1 with " << print(U[i]) << "." << endl;
          else if (rep2)
            cout << "Replace J2 with " << print(U[j]) << "." << endl;
          cout << "Put the first square to (" << r1 << ", " << c1 << ")."
               << endl;
          cout << "Put the second square to (" << r2 << ", " << c2 << ")."
               << endl;
          return 0;
        }
      }
  cout << "No solution." << endl;
  return 0;
}
