#include <bits/stdc++.h>
using namespace std;
int n, m, cnt;
string a[20][20];
struct node {
  int x, y;
} p[2], ans[2];
node f[1000];
set<string> have;
set<char> g, gg;
bool check() {
  int num = 0;
  for (int i = 0; i < n - 2; i++)
    for (int j = 0; j < m - 2; j++) {
      g.clear();
      gg.clear();
      for (int k = i; k < i + 3; k++)
        for (int l = j; l < j + 3; l++) {
          g.insert(a[k][l][0]);
          gg.insert(a[k][l][1]);
        }
      if (g.size() == 9 || gg.size() == 1) {
        f[num].x = i;
        f[num].y = j;
        num++;
      }
    }
  for (int i = 0; i < num; i++)
    for (int j = i + 1; j < num; j++)
      if ((abs(f[i].x - f[j].x) >= 3 || abs(f[i].y - f[j].y) >= 3)) {
        ans[0] = f[i];
        ans[1] = f[j];
        return 1;
      }
  return 0;
}
char m1[15] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
char m2[4] = {'C', 'D', 'H', 'S'};
int caocao = 0;
void out() {
  printf("Put the first square to (%d, %d).\n", ans[0].x + 1, ans[0].y + 1);
  printf("Put the second square to (%d, %d).\n", ans[1].x + 1, ans[1].y + 1);
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
      have.insert(a[i][j]);
      if (a[i][j][0] == 'J' && (a[i][j][1] == '1' || a[i][j][1] == '2')) {
        caocao = a[i][j][1] - '1';
        p[a[i][j][1] - '1'].x = i;
        p[a[i][j][1] - '1'].y = j;
        cnt++;
      }
    }
  if (cnt == 0) {
    if (check()) {
      printf("Solution exists.\n");
      printf("There are no jokers.\n");
      out();
      return 0;
    }
  } else {
    if (cnt == 1) {
      for (int i = 0; i < 13; i++)
        for (int j = 0; j < 4; j++) {
          string k;
          k += m1[i];
          k += m2[j];
          if (have.find(k) == have.end()) {
            a[p[caocao].x][p[caocao].y] = k;
            if (check()) {
              printf("Solution exists.\n");
              printf("Replace J%d with ", caocao + 1);
              cout << k << "." << endl;
              out();
              return 0;
            }
          }
        }
    } else {
      for (int i = 0; i < 13; i++)
        for (int j = 0; j < 4; j++) {
          string k1;
          k1 += m1[i];
          k1 += m2[j];
          if (have.find(k1) == have.end()) {
            a[p[0].x][p[0].y] = k1;
            for (int k = 0; k < 13; k++)
              for (int l = 0; l < 4; l++)
                if (!(k == i && l == j)) {
                  string k2;
                  k2 += m1[k];
                  k2 += m2[l];
                  if (have.find(k2) == have.end()) {
                    a[p[1].x][p[1].y] = k2;
                    if (check()) {
                      printf("Solution exists.\n");
                      cout << "Replace J1 with " << k1 << " and J2 with " << k2
                           << "." << endl;
                      out();
                      return 0;
                    }
                  }
                }
          }
        }
    }
  }
  printf("No solution.\n");
  return 0;
}
