#include <bits/stdc++.h>
using namespace std;
int n, m, s;
char a[20][20][3],
    suita[] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
char suitb[] = {'C', 'D', 'H', 'S'}, x[3], y[3];
bool seen[1000];
char jok[39], jok2[39];
struct Poz {
  int lin, col;
} joker1, joker2, sq[100000], c1, c2, c3, c4;
unordered_map<string, bool> mama;
bool Verif(int lin, int col) {
  int i, j;
  int ok = 1;
  for (i = lin; i <= lin + 2 && ok == 1; i++)
    for (j = col; j <= col + 2 && ok == 1; j++)
      if (a[lin][col][1] != a[i][j][1]) ok = 0;
  if (ok == 1) return true;
  for (i = lin; i <= lin + 2; i++)
    for (j = col; j <= col + 2; j++)
      if (seen[a[i][j][0]] == 1)
        return false;
      else
        seen[a[i][j][0]] = 1;
  return true;
}
int main() {
  int i, j, i1, j1, i2, j2, nr;
  cin >> n >> m;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) {
      cin >> a[i][j];
      if (a[i][j][0] == 'J' && (a[i][j][1] == '1' || a[i][j][1] == '2')) {
        nr = a[i][j][1] - '0';
        if (joker1.lin == 0)
          joker1 = {i, j};
        else
          joker2 = {i, j};
      }
      mama[a[i][j]] = 1;
    }
  if (joker1.lin == 0) {
    for (i = 1; i <= n - 2; i++)
      for (j = 1; j <= m - 2; j++) {
        memset(seen, 0, sizeof(seen));
        if (Verif(i, j) == true) sq[++s] = {i, j};
      }
    for (i = 1; i < s; i++)
      for (j = i + 1; j <= s; j++) {
        if (abs(sq[j].lin - sq[i].lin) >= 3 ||
            abs(sq[j].col - sq[i].col) >= 3) {
          cout << "Solution exists." << '\n';
          cout << "There are no jokers." << '\n';
          cout << "Put the first square to (" << sq[i].lin << ", " << sq[i].col
               << ")." << '\n';
          cout << "Put the second square to (" << sq[j].lin << ", " << sq[j].col
               << ")." << '\n';
          return 0;
        }
      }
    cout << "No solution.";
    return 0;
  }
  if (joker2.lin == 0) {
    int sz = 13, sz2 = 4;
    for (i = 0; i < sz; i++) {
      for (j = 0; j < sz2; j++) {
        x[0] = suita[i];
        x[1] = suitb[j];
        if (mama[x] == 0) {
          strcpy(a[joker1.lin][joker1.col], x);
          s = 0;
          for (i1 = 1; i1 <= n - 2; i1++)
            for (j1 = 1; j1 <= m - 2; j1++) {
              memset(seen, 0, sizeof(seen));
              if (Verif(i1, j1) == true) sq[++s] = {i1, j1};
            }
          for (i1 = 1; i1 < s; i1++)
            for (j1 = i1 + 1; j1 <= s; j1++) {
              if (abs(sq[j1].lin - sq[i1].lin) >= 3 ||
                  abs(sq[j1].col - sq[i1].col) >= 3) {
                cout << "Solution exists." << '\n';
                cout << "Replace J" << nr << " with " << x << '.' << '\n';
                cout << "Put the first square to (" << sq[i1].lin << ", "
                     << sq[i1].col << ")." << '\n';
                cout << "Put the second square to (" << sq[j1].lin << ", "
                     << sq[j1].col << ")." << '\n';
                return 0;
              }
            }
        }
      }
    }
    cout << "No solution.";
    return 0;
  }
  int sz = 13, sz2 = 4;
  for (i = 0; i < sz; i++) {
    for (j = 0; j < sz2; j++) {
      memset(x, 0, sizeof(x));
      x[0] = suita[i];
      x[1] = suitb[j];
      if (mama[x] == 0) {
        mama[x] = 1;
        strcpy(jok, a[joker1.lin][joker1.col]);
        strcpy(a[joker1.lin][joker1.col], x);
        for (i2 = 0; i2 < sz; i2++)
          for (j2 = 0; j2 < sz2; j2++) {
            y[0] = suita[i2];
            y[1] = suitb[j2];
            if (mama[y] == 0) {
              s = 0;
              strcpy(jok2, a[joker2.lin][joker2.col]);
              strcpy(a[joker2.lin][joker2.col], y);
              for (i1 = 1; i1 <= n - 2; i1++)
                for (j1 = 1; j1 <= m - 2; j1++) {
                  memset(seen, 0, sizeof(seen));
                  if (Verif(i1, j1) == true) sq[++s] = {i1, j1};
                }
              for (i1 = 1; i1 < s; i1++)
                for (j1 = i1 + 1; j1 <= s; j1++) {
                  if (abs(sq[j1].lin - sq[i1].lin) >= 3 ||
                      abs(sq[j1].col - sq[i1].col) >= 3) {
                    cout << "Solution exists." << '\n';
                    if (jok[1] == '1') {
                      cout << "Replace J" << jok[1] << " with " << x[0] << x[1];
                      cout << " and J" << jok2[1] << " with " << y[0] << y[1]
                           << '.' << '\n';
                      cout << "Put the first square to (" << sq[i1].lin << ", "
                           << sq[i1].col << ")." << '\n';
                      cout << "Put the second square to (" << sq[j1].lin << ", "
                           << sq[j1].col << ")." << '\n';
                    } else {
                      cout << "Replace J" << jok2[1] << " with " << y[0]
                           << y[1];
                      cout << " and J" << jok[1] << " with " << x[0] << x[1]
                           << '.' << '\n';
                      cout << "Put the first square to (" << sq[j1].lin << ", "
                           << sq[j1].col << ")." << '\n';
                      cout << "Put the second square to (" << sq[i1].lin << ", "
                           << sq[i1].col << ")." << '\n';
                    }
                    return 0;
                  }
                }
              strcpy(a[joker2.lin][joker2.col], jok2);
            }
          }
        mama[x] = 0;
        strcpy(a[joker1.lin][joker1.col], jok);
      }
    }
  }
  cout << "No solution.";
  return 0;
}
