#include <bits/stdc++.h>
using namespace std;
char card[][4] = {"2C", "2D", "2H", "2S", "3C", "3D", "3H", "3S", "4C",
                  "4D", "4H", "4S", "5C", "5D", "5H", "5S", "6C", "6D",
                  "6H", "6S", "7C", "7D", "7H", "7S", "8C", "8D", "8H",
                  "8S", "9C", "9D", "9H", "9S", "TC", "TD", "TH", "TS",
                  "JC", "JD", "JH", "JS", "QC", "QD", "QH", "QS", "KC",
                  "KD", "KH", "KS", "AC", "AD", "AH", "AS"};
int used[100];
map<string, int> id;
char mat[100][100][4];
int n, m;
int vis[100][100], pass;
bool ok(int a, int b) {
  set<char> ff, ss;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) {
      if (vis[a + i][b + j] == pass) return false;
      vis[a + i][b + j] = pass;
      ff.insert(mat[a + i][b + j][0]);
      ss.insert(mat[a + i][b + j][1]);
    }
  return (int)ff.size() == 9 || (int)ss.size() == 1;
}
tuple<int, int, int, int> check() {
  for (int i = 0; i < n - 2; i++)
    for (int j = 0; j < m - 2; j++) {
      for (int k = 0; k < n - 2; k++)
        for (int l = 0; l < m - 2; l++) {
          pass++;
          if (!ok(i, j)) continue;
          if (!ok(k, l)) continue;
          return make_tuple(i + 1, j + 1, k + 1, l + 1);
        }
    }
  return make_tuple(-1, -1, -1, -1);
}
int main() {
  for (int i = 0; i < 52; i++) id[card[i]] = i;
  scanf("%d %d", &n, &m);
  int a = -1, b = -1, c = -1, d = -1;
  char num;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      scanf(" %s", mat[i][j]);
      if (mat[i][j][0] == 'J' && (mat[i][j][1] == '1' || mat[i][j][1] == '2')) {
        num = mat[i][j][1];
        c = a, d = b;
        a = i, b = j;
      } else
        used[id[mat[i][j]]] = 1;
    }
  int q, w, e, r;
  if (a == -1) {
    tie(q, w, e, r) = check();
    if (q == -1) {
      return printf("No solution.\n"), 0;
    }
    printf("Solution exists.\n");
    printf("There are no jokers.\n");
    printf("Put the first square to (%d, %d).\n", q, w);
    printf("Put the second square to (%d, %d).\n", e, r);
    return 0;
  }
  if (c == -1) {
    for (int i = 0; i < 52; i++)
      if (!used[i]) {
        strcpy(mat[a][b], card[i]);
        tie(q, w, e, r) = check();
        if (q == -1) continue;
        printf("Solution exists.\n");
        printf("Replace J%c with %s.\n", num, card[i]);
        printf("Put the first square to (%d, %d).\n", q, w);
        printf("Put the second square to (%d, %d).\n", e, r);
        return 0;
      }
    return printf("No solution.\n"), 0;
  }
  for (int i = 0; i < 52; i++)
    if (!used[i]) {
      for (int j = 0; j < 52; j++)
        if (j != i && !used[j]) {
          strcpy(mat[a][b], card[i]);
          strcpy(mat[c][d], card[j]);
          tie(q, w, e, r) = check();
          if (q == -1) continue;
          printf("Solution exists.\n");
          if (num == '1') {
            printf("Replace J1 with %s and J2 with %s.\n", card[i], card[j]);
          } else {
            printf("Replace J1 with %s and J2 with %s.\n", card[j], card[i]);
          }
          printf("Put the first square to (%d, %d).\n", q, w);
          printf("Put the second square to (%d, %d).\n", e, r);
          return 0;
        }
    }
  printf("No solution.\n");
}
