#include <bits/stdc++.h>
using namespace std;
string A[25][25];
bool check1(int r, int c) {
  set<char> S;
  int cnt = 0;
  for (int i = r; i <= r + 2; i++)
    for (int j = c; j <= c + 2; j++)
      if (A[i][j] == "J1" || A[i][j] == "J2") {
        cnt++;
      } else
        S.insert(A[i][j][0]);
  return ((S.size() + cnt) == 9);
}
bool check2(int r1, int c1, int r2, int c2) {
  for (int i = r1; i <= r1 + 2; i++)
    for (int j = c1; j <= c1 + 2; j++)
      if (r2 <= i && i <= r2 + 2 && c2 <= j && j <= c2 + 2) {
        return false;
      }
  return true;
}
bool check3(int r, int c) {
  set<char> S;
  for (int i = r; i <= r + 2; i++)
    for (int j = c; j <= c + 2; j++) S.insert(A[i][j][0]);
  return (S.size() == 9);
}
int main() {
  std::ios::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  string tmpRank[13] = {"2", "3", "4", "5", "6", "7", "8",
                        "9", "T", "J", "Q", "K", "A"};
  string tmpSuit[4] = {"C", "D", "H", "S"};
  set<string> Pack;
  for (int i = 0; i < 13; i++)
    for (int j = 0; j < 4; j++) Pack.insert(tmpRank[i] + tmpSuit[j]);
  bool isThereJ1 = false;
  int J1r;
  int J1c;
  bool isThereJ2 = false;
  int J2r;
  int J2c;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      cin >> A[i][j];
      if (A[i][j] == "J1") {
        isThereJ1 = true;
        J1r = i;
        J1c = j;
        continue;
      }
      if (A[i][j] == "J2") {
        isThereJ2 = true;
        J2r = i;
        J2c = j;
        continue;
      }
      Pack.erase(Pack.find(A[i][j]));
    }
  vector<pair<int, int>> V;
  for (int r = 1; r <= n - 2; r++)
    for (int c = 1; c <= m - 2; c++)
      if (check1(r, c)) V.push_back(make_pair(r, c));
  for (int i = 0; i < V.size(); i++)
    for (int j = 0; j < V.size(); j++) {
      if (i == j) continue;
      int r1 = V[i].first;
      int c1 = V[i].second;
      int r2 = V[j].first;
      int c2 = V[j].second;
      if (check2(r1, c1, r2, c2)) {
        if (isThereJ1 && isThereJ2) {
          for (set<string>::iterator it1 = Pack.begin(); it1 != Pack.end();
               it1++)
            for (set<string>::iterator it2 = Pack.begin(); it2 != Pack.end();
                 it2++) {
              if (it1 == it2) continue;
              A[J1r][J1c] = *it1;
              A[J2r][J2c] = *it2;
              if (check3(r1, c1) && check3(r2, c2)) {
                cout << "Solution exists." << endl;
                cout << "Replace J1 with " << (*it1) << " and J2 with "
                     << (*it2) << "." << endl;
                cout << "Put the first square to (" << r1 << ", " << c1 << ")."
                     << endl;
                cout << "Put the second square to (" << r2 << ", " << c2
                     << ").";
                return 0;
              }
              A[J1r][J1c] = "J1";
              A[J2r][J2c] = "J2";
            }
          continue;
        }
        if (isThereJ1) {
          for (set<string>::iterator it = Pack.begin(); it != Pack.end();
               it++) {
            A[J1r][J1c] = *it;
            if (check3(r1, c1) && check3(r2, c2)) {
              cout << "Solution exists." << endl;
              cout << "Replace J1 with " << (*it) << "." << endl;
              cout << "Put the first square to (" << r1 << ", " << c1 << ")."
                   << endl;
              cout << "Put the second square to (" << r2 << ", " << c2 << ").";
              return 0;
            }
            A[J1r][J1c] = "J1";
          }
          continue;
        }
        if (isThereJ2) {
          for (set<string>::iterator it = Pack.begin(); it != Pack.end();
               it++) {
            A[J2r][J2c] = *it;
            if (check3(r1, c1) && check3(r2, c2)) {
              cout << "Solution exists." << endl;
              cout << "Replace J2 with " << (*it) << "." << endl;
              cout << "Put the first square to (" << r1 << ", " << c1 << ")."
                   << endl;
              cout << "Put the second square to (" << r2 << ", " << c2 << ").";
              return 0;
            }
            A[J2r][J2c] = "J2";
          }
          continue;
        }
        cout << "Solution exists." << endl;
        cout << "There are no jokers." << endl;
        cout << "Put the first square to (" << r1 << ", " << c1 << ")." << endl;
        cout << "Put the second square to (" << r2 << ", " << c2 << ").";
        return 0;
      }
    }
  cout << "No solution.";
}
