#include <bits/stdc++.h>
enum { M = 4, D = 13, MAX = M * D + 2 };
typedef struct Card {
  int d, m;
} Card;
Card a[MAX][MAX];
char n2m[M] = {'C', 'D', 'H', 'S'};
char n2d[D] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
int m2n(char m) {
  switch (m) {
    case 'C':
      return 0;
    case 'D':
      return 1;
    case 'H':
      return 2;
    case 'S':
      return 3;
    default:
      return -1;
  }
}
int d2n(char d) {
  switch (d) {
    case 'T':
      return 8;
    case 'J':
      return 9;
    case 'Q':
      return 10;
    case 'K':
      return 11;
    case 'A':
      return 12;
    default:
      return d - '2';
  }
}
int good(int r, int c) {
  int m = a[r][c].m;
  int goodm = 1;
  int ud[D] = {};
  int goodd = 1;
  int i, j;
  for (i = r; i < r + 3; ++i) {
    for (j = c; j < c + 3; ++j) {
      goodm &= (a[i][j].m == m);
      goodd &= (ud[a[i][j].d] == 0);
      ud[a[i][j].d] = 1;
    }
  }
  return goodm || goodd;
}
int main(void) {
  int n, m, i, j;
  char s[MAX];
  int j1r, j1c, j2r, j2c;
  j1r = j1c = j2r = j2c = -1;
  int used[M][D] = {};
  scanf("%d %d", &n, &m);
  for (i = 0; i < n; ++i) {
    for (j = 0; j < m; ++j) {
      scanf("%s", s);
      a[i][j].d = d2n(s[0]);
      a[i][j].m = m2n(s[1]);
      if (s[1] == '1') {
        j1r = i;
        j1c = j;
      } else if (s[1] == '2') {
        j2r = i;
        j2c = j;
      } else {
        used[a[i][j].m][a[i][j].d] = 1;
      }
    }
  }
  int m1, d1, m2, d2, r1, c1, r2, c2;
  for (m1 = 0; m1 < M; ++m1) {
    for (d1 = 0; d1 < D; ++d1) {
      if (used[m1][d1]) continue;
      used[m1][d1] = 1;
      if (j1r > -1) {
        a[j1r][j1c].d = d1;
        a[j1r][j1c].m = m1;
      }
      for (m2 = 0; m2 < M; ++m2) {
        for (d2 = 0; d2 < D; ++d2) {
          if (used[m2][d2]) continue;
          used[m2][d2] = 1;
          if (j2r > -1) {
            a[j2r][j2c].d = d2;
            a[j2r][j2c].m = m2;
          }
          for (r1 = 0; r1 < n - 2; ++r1) {
            for (c1 = 0; c1 < m - 2; ++c1) {
              for (r2 = r1; r2 < n - 2; ++r2) {
                for (c2 = 0; c2 < m - 2; ++c2) {
                  if ((r2 < r1 + 3) && ((c2 >= c1 && c2 < c1 + 3) ||
                                        (c2 + 2 >= c1 && c2 + 2 < c1 + 3)))
                    continue;
                  if (good(r1, c1) && good(r2, c2)) {
                    printf("Solution exists.\n");
                    if (j1r == -1 && j2r == -1) {
                      printf("There are no jokers.\n");
                    } else if (j1r == -1) {
                      printf("Replace J2 with %c%c.\n", n2d[d2], n2m[m2]);
                    } else if (j2r == -1) {
                      printf("Replace J1 with %c%c.\n", n2d[d1], n2m[m1]);
                    } else {
                      printf("Replace J1 with %c%C and J2 with %c%c.\n",
                             n2d[d1], n2m[m1], n2d[d2], n2m[m2]);
                    }
                    printf("Put the first square to (%d, %d).\n", r1 + 1,
                           c1 + 1);
                    printf("Put the second square to (%d, %d).\n", r2 + 1,
                           c2 + 1);
                    return 0;
                  }
                }
              }
            }
          }
          used[m2][d2] = 0;
        }
      }
      used[m1][d1] = 0;
    }
  }
  printf("No solution.\n");
  return 0;
}
