#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int num = 0;
  char c = getchar();
  if (c == '-') return -read();
  while (c >= '0' && c <= '9') {
    num = (num << 3) + (num << 1) + c - '0';
    c = getchar();
  }
  return num;
}
inline long long READ() {
  long long num = 0;
  char c = getchar();
  if (c == '-') return -READ();
  while (c >= '0' && c <= '9') {
    num = (num << 3) + (num << 1) + c - '0';
    c = getchar();
  }
  return num;
}
int n, m;
int num[20][20], col[20][20];
int xj1 = -1, yj1 = -1, xj2 = -1, yj2 = -1;
char inptmp[7];
const int jnum = 19260817;
bool used[4][20];
vector<int> validx, validy;
int isvalid(int x, int y) {
  if (x >= n - 2 || y >= m - 2) return 0;
  for (int i = 0; i < 4; i++) {
    bool can = 1;
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 3; k++) {
        if (col[x + j][y + k] != i && col[x + j][y + k] != jnum) can = 0;
        if (!can) break;
      }
      if (!can) break;
    }
    if (can) return 1;
  }
  unordered_set<int> nums;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) nums.insert(num[x + i][y + j]);
  if (((int)(nums).size()) == 9) return 2;
  return 0;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      scanf("%s", inptmp);
      if (inptmp[0] == 'J' && isdigit(inptmp[1])) {
        if (inptmp[1] == '1') {
          xj1 = i;
          yj1 = j;
          num[i][j] = 1;
        } else {
          xj2 = i;
          yj2 = j;
          num[i][j] = 2;
        }
        col[i][j] = jnum;
      } else {
        if (isdigit(inptmp[0]))
          num[i][j] = inptmp[0] - '0';
        else if (inptmp[0] == 'T')
          num[i][j] = 10;
        else if (inptmp[0] == 'J')
          num[i][j] = 11;
        else if (inptmp[0] == 'Q')
          num[i][j] = 12;
        else if (inptmp[0] == 'K')
          num[i][j] = 13;
        else
          num[i][j] = 14;
        if (inptmp[1] == 'C')
          col[i][j] = 0;
        else if (inptmp[1] == 'D')
          col[i][j] = 1;
        else if (inptmp[1] == 'H')
          col[i][j] = 2;
        else
          col[i][j] = 3;
        used[col[i][j]][num[i][j]] = 1;
      }
    }
  for (int col1 = 0; col1 < 4; col1++)
    for (int num1 = 2; num1 < 15; num1++)
      if (!used[col1][num1] || xj1 == -1) {
        if (xj1 != -1) {
          used[col1][num1] = 1;
          col[xj1][yj1] = col1;
          num[xj1][yj1] = num1;
        }
        for (int col2 = 0; col2 < 4; col2++)
          for (int num2 = 2; num2 < 15; num2++)
            if (!used[col2][num2] || xj2 == -1) {
              if (xj2 != -1) {
                col[xj2][yj2] = col2;
                num[xj2][yj2] = num2;
              }
              validx.resize(0);
              validy.resize(0);
              for (int i = 0; i < n - 2; i++)
                for (int j = 0; j < m - 2; j++) {
                  int xxx = isvalid(i, j);
                  if (!xxx) continue;
                  validx.push_back(i);
                  validy.push_back(j);
                }
              for (int i = 0; i < ((int)(validx).size()); i++) {
                int x1 = validx[i],
                    yxiaomiexuduhuanrenleiwannianankang = validy[i];
                for (int j = i + 1; j < ((int)(validx).size()); j++) {
                  int x2 = validx[j], y2 = validy[j];
                  if (x2 - x1 < 3 &&
                      y2 - yxiaomiexuduhuanrenleiwannianankang < 3)
                    continue;
                  printf("Solution exists.\n");
                  if (xj1 == -1 && xj2 == -1) printf("There are no jokers.\n");
                  if (xj1 != -1) {
                    printf("Replace J1 with ");
                    if (num1 < 10)
                      printf("%d", num1);
                    else if (num1 == 10)
                      printf("T");
                    else if (num1 == 11)
                      printf("J");
                    else if (num1 == 12)
                      printf("Q");
                    else if (num1 == 13)
                      printf("K");
                    else
                      printf("A");
                    if (col1 == 0)
                      printf("C");
                    else if (col1 == 1)
                      printf("D");
                    else if (col1 == 2)
                      printf("H");
                    else
                      printf("S");
                    if (xj2 == -1) printf(".\n");
                  }
                  if (xj2 != -1) {
                    if (xj1 != -1)
                      printf(" and J2 with ");
                    else
                      printf("Replace J2 with ");
                    if (num2 < 10)
                      printf("%d", num2);
                    else if (num2 == 10)
                      printf("T");
                    else if (num2 == 11)
                      printf("J");
                    else if (num2 == 12)
                      printf("Q");
                    else if (num2 == 13)
                      printf("K");
                    else
                      printf("A");
                    if (col2 == 0)
                      printf("C");
                    else if (col2 == 1)
                      printf("D");
                    else if (col2 == 2)
                      printf("H");
                    else
                      printf("S");
                    printf(".\n");
                  }
                  printf("Put the first square to (%d, %d).\n", x1 + 1,
                         yxiaomiexuduhuanrenleiwannianankang + 1);
                  printf("Put the second square to (%d, %d).\n", x2 + 1,
                         y2 + 1);
                  return 0;
                }
              }
              if (xj2 == -1) goto GOTO;
            }
      GOTO:;
        if (xj1 == -1) goto GOTO2;
        used[col1][num1] = 0;
      }
GOTO2:;
  return printf("No solution.\n"), 0;
}
