#include <bits/stdc++.h>
using namespace std;
bool searchRect(int n, int m, vector<string> jok, vector<vector<string> > v) {
  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) {
          if (abs(i - k) < 3 && abs(l - j) < 3) continue;
          set<char> rect[2][2];
          for (int l1 = 0; l1 < 3; ++l1)
            for (int l2 = 0; l2 < 3; ++l2) {
              string s;
              s = v[i + l1][j + l2];
              rect[0][0].insert(s[0]);
              rect[0][1].insert(s[1]);
              s = v[k + l1][l + l2];
              rect[1][0].insert(s[0]);
              rect[1][1].insert(s[1]);
            }
          for (int l1 = 0; l1 < 2; ++l1)
            for (int l2 = 0; l2 < 2; ++l2)
              if (rect[0][l1].size() == 9 && rect[1][l2].size() == 9) {
                cout << "Solution exists." << endl;
                if (jok[0] == "0")
                  cout << "There are no jokers." << endl;
                else if (jok[0] == "1")
                  cout << "Replace J1 with " << jok[1] << "." << endl;
                else if (jok[0] == "2")
                  cout << "Replace J2 with " << jok[1] << "." << endl;
                else if (jok[0] == "3")
                  cout << "Replace J1 with " << jok[1] << " and J2 with "
                       << jok[2] << "." << endl;
                else
                  cout << "Replace J1 with " << jok[2] << " and J2 with "
                       << jok[1] << "." << endl;
                cout << "Put the first square to (" << i + 1 << ", " << j + 1
                     << ")." << endl;
                cout << "Put the second square to (" << k + 1 << ", " << l + 1
                     << ")." << endl;
                return 1;
              }
        }
  return 0;
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<string> > v;
  set<string> st;
  vector<string> jok;
  vector<int> jokpos;
  for (int i = 0; i < n; ++i) {
    vector<string> temp;
    string s;
    for (int j = 0; j < m; ++j) {
      cin >> s;
      if (s == "J1" || s == "J2") {
        jok.push_back(s);
        jokpos.push_back(i);
        jokpos.push_back(j);
      }
      temp.push_back(s);
      st.insert(s);
    }
    v.push_back(temp);
  }
  char s1[] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'Q', 'K', 'J', 'A'};
  char s2[] = {'C', 'D', 'H', 'S'};
  vector<string> vt;
  for (int p = 0; p < 13; ++p)
    for (int q = 0; q < 4; ++q) {
      string s;
      s.push_back(s1[p]);
      s.push_back(s2[q]);
      if (st.find(s) == st.end()) {
        vt.push_back(s);
      }
    }
  vector<string> zjok;
  if (jok.size() == 0)
    zjok.push_back("0");
  else if (jok.size() == 1 && jok[0] == "J1")
    zjok.push_back("1");
  else if (jok.size() == 1 && jok[0] == "J2")
    zjok.push_back("2");
  else if (jok.size() == 2 && jok[0] == "J1")
    zjok.push_back("3");
  else if (jok.size() == 2 && jok[0] == "J2")
    zjok.push_back("4");
  if (jok.size() == 0) {
    if (searchRect(n, m, zjok, v)) return 0;
  } else if (jok.size() == 1) {
    zjok.push_back("");
    for (int i = 0; i < vt.size(); ++i) {
      zjok[1] = vt[i];
      v[jokpos[0]][jokpos[1]] = vt[i];
      if (searchRect(n, m, zjok, v)) return 0;
    }
  } else if (jok.size() == 2) {
    zjok.push_back("");
    zjok.push_back("");
    for (int i = 0; i < vt.size(); ++i)
      for (int j = 0; j < vt.size(); ++j)
        if (i != j) {
          zjok[1] = vt[i];
          zjok[2] = vt[j];
          v[jokpos[0]][jokpos[1]] = vt[i];
          v[jokpos[2]][jokpos[3]] = vt[j];
          if (searchRect(n, m, zjok, v)) return 0;
        }
  }
  cout << "No solution.";
}
