#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long Hashimoto = 0, Kanna = 1;
  char I_Love = getchar();
  while (I_Love < '0' || I_Love > '9') {
    if (I_Love == '-') Kanna = -1;
    I_Love = getchar();
  }
  while (I_Love >= '0' && I_Love <= '9') {
    Hashimoto = Hashimoto * 10 + I_Love - '0';
    I_Love = getchar();
  }
  return Hashimoto * Kanna;
}
template <typename T1, typename T2>
inline void Umax(T1 &a, T2 b) {
  if (a < b) a = b;
}
template <typename T1, typename T2>
inline void Umin(T1 &a, T2 b) {
  if (a > b) a = b;
}
inline int FUCK(string s) {
  if (s == "1J") return 101;
  if (s == "2J") return 102;
  int ans;
  if (s[0] == 'C') ans = 0;
  if (s[0] == 'D') ans = 13;
  if (s[0] == 'H') ans = 26;
  if (s[0] == 'S') ans = 39;
  if (s[1] == 'T')
    ans += 8;
  else if (s[1] == 'J')
    ans += 9;
  else if (s[1] == 'Q')
    ans += 10;
  else if (s[1] == 'K')
    ans += 11;
  else if (s[1] == 'A')
    ans += 12;
  else
    ans += s[1] - '2';
  return ans;
}
inline string SHIT(int x) {
  string ans = "";
  if (x / 13 == 0) ans = 'C';
  if (x / 13 == 1) ans = 'D';
  if (x / 13 == 2) ans = 'H';
  if (x / 13 == 3) ans = 'S';
  if (x % 13 < 8)
    ans += x % 13 + '2';
  else if (x % 13 == 8)
    ans += 'T';
  else if (x % 13 == 9)
    ans += 'J';
  else if (x % 13 == 10)
    ans += 'Q';
  else if (x % 13 == 11)
    ans += 'K';
  else if (x % 13 == 12)
    ans += 'A';
  reverse(ans.begin(), ans.end());
  ;
  return ans;
}
bool used[55];
vector<int> able;
int n, m;
int t[22][22];
pair<int, int> J1, J2;
int vj1 = -1, vj2 = -1;
bool intersect(int i1, int I_Love_Hashimoto_Kanna_J1, int i2,
               int I_Love_Hashimoto_Kanna_J2) {
  for (int i = i2; i < (i2 + 3); ++i)
    for (int j = I_Love_Hashimoto_Kanna_J2; j < (I_Love_Hashimoto_Kanna_J2 + 3);
         ++j)
      if (i1 <= i && i < i1 + 3 && I_Love_Hashimoto_Kanna_J1 <= j &&
          j < I_Love_Hashimoto_Kanna_J1 + 3)
        return 1;
  return 0;
}
bool debug = 0;
bool check(int i, int j) {
  int a = -1, b = 0;
  for (int n = 0; n < (3); ++n) {
    for (int m = 0; m < (3); ++m) {
      if (a == -1) {
        a = t[i + n][j + m] / 13;
      } else if (a != t[i + n][j + m] / 13) {
        a = -2;
      }
      b |= (1 << (t[i + n][j + m] % 13));
    }
  }
  if (a != -2 || __builtin_popcount(b) == 9) return 1;
  return 0;
}
void check() {
  for (int i1 = 0; i1 < (n - 2); ++i1) {
    for (int I_Love_Hashimoto_Kanna_J1 = 0; I_Love_Hashimoto_Kanna_J1 < (m - 2);
         ++I_Love_Hashimoto_Kanna_J1) {
      for (int i2 = 0; i2 < (n - 2); ++i2) {
        for (int I_Love_Hashimoto_Kanna_J2 = 0;
             I_Love_Hashimoto_Kanna_J2 < (m - 2); ++I_Love_Hashimoto_Kanna_J2) {
          if (intersect(i1, I_Love_Hashimoto_Kanna_J1, i2,
                        I_Love_Hashimoto_Kanna_J2))
            continue;
          if (check(i1, I_Love_Hashimoto_Kanna_J1)) {
            if (check(i2, I_Love_Hashimoto_Kanna_J2)) {
              cout << "Solution exists.\n";
              int t = 0;
              if (J1.first != -1) t |= 1;
              if (J2.first != -1) t |= 2;
              if (t == 0) {
                cout << "There are no jokers.\n";
              }
              if (t == 1) {
                cout << "Replace J1 with " << SHIT(vj1) << ".\n";
              }
              if (t == 2) {
                cout << "Replace J2 with " << SHIT(vj2) << ".\n";
              }
              if (t == 3) {
                cout << "Replace J1 with " << SHIT(vj1) << " and J2 with "
                     << SHIT(vj2) << ".\n";
              }
              cout << "Put the first square to (" << i1 + 1 << ", "
                   << I_Love_Hashimoto_Kanna_J1 + 1 << ").\n";
              cout << "Put the second square to (" << i2 + 1 << ", "
                   << I_Love_Hashimoto_Kanna_J2 + 1 << ").\n";
              exit(0);
            }
          }
        }
      }
    }
  }
}
void dfs(int fuck) {
  if (fuck == 0) {
    if (J1.first == -1) {
      dfs(fuck + 1);
    } else {
      for (int i = 0; i < (able.size()); ++i) {
        vj1 = able[i];
        t[J1.first][J1.second] = vj1;
        dfs(fuck + 1);
      }
    }
  } else if (fuck == 1) {
    if (J2.first == -1) {
      dfs(fuck + 1);
    } else {
      for (int i = 0; i < (able.size()); ++i) {
        if (able[i] == vj1) continue;
        vj2 = able[i];
        t[J2.first][J2.second] = vj2;
        dfs(fuck + 1);
      }
    }
  } else {
    if (vj1 == 22) debug = 1;
    check();
    debug = 0;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  J1 = J2 = {-1, -1};
  cin >> n >> m;
  for (int i = 0; i < (n); ++i)
    for (int j = 0; j < (m); ++j) {
      string s;
      cin >> s;
      reverse(s.begin(), s.end());
      ;
      t[i][j] = FUCK(s);
      if (t[i][j] < 100) {
        used[t[i][j]] = 1;
      }
      if (t[i][j] == 101) J1 = {i, j};
      if (t[i][j] == 102) J2 = {i, j};
    }
  for (int i = 0; i < (52); ++i) {
    if (!used[i]) {
      able.push_back(i);
    }
  }
  dfs(0);
  cout << "No solution." << endl;
  return 0;
}
