#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int N = 100005;
const double PI = 4 * atan(1);
const long long MAX = 9223372036854775807;
int dx[] = {1, -1, 0, 0, 1, -1, 1, -1};
int dy[] = {0, 0, 1, -1, 1, 1, -1, -1};
long long gcd(long long a, long long b) { return (b == 0 ? a : gcd(b, a % b)); }
long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }
bool issquare(long long w) { return trunc(sqrt(w)) * trunc(sqrt(w)) == w; }
bool isprime(long long u) {
  for (long long i = 2; i <= (int)sqrt(u); i++) {
    if (u % i == 0) return 0;
  }
  return 1;
}
long long mod(long long to_mod, long long MOD) {
  to_mod %= MOD;
  while (to_mod < 0) to_mod += MOD;
  return to_mod % MOD;
}
long long moduloMultiplication(long long a, long long b, long long mod) {
  long long res = 0;
  a %= mod;
  while (b) {
    if (b & 1) res = (res + a) % mod;
    a = (2 * a) % mod;
    b >>= 1;
  }
  return res;
}
long long power(long long x, long long y) {
  long long res = 1;
  x = x;
  while (y > 0) {
    if (y & 1) res = (res * x);
    y = y >> 1;
    x = (x * x);
  }
  return res;
}
long long n, m, x, y, res, t, k, ans = 0, b, q, z, l, a, c, d;
set<string> tab[20][20];
long long dp[20][20];
bool ok[20][20];
string grid[20][20];
vector<string> color = {"C", "D", "H", "S"},
               number = {"2", "3", "4", "5", "6", "7", "8",
                         "9", "T", "J", "Q", "K", "A"};
set<string> cards;
bool j3 = false, j2 = false;
string j11 = "", j22 = "";
int main() {
  ios::sync_with_stdio(0);
  memset(ok, 0, sizeof(ok));
  memset(dp, 0, sizeof(dp));
  for (auto t : number) {
    for (auto i : color) {
      string sh = t + i;
      cards.insert(sh);
    }
  }
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      string sh;
      cin >> sh;
      if (sh == "J1") j3 = true;
      if (sh == "J2") j2 = true;
      grid[i][j] = sh;
      cards.erase(sh);
    }
  }
  for (int i = 0; i < n - 2; i++) {
    for (int j = 0; j < m - 2; j++) {
      set<char> col;
      set<char> num;
      res = 0;
      a = 0;
      for (int k = i; k <= i + 2; k++) {
        for (int u = j; u <= j + 2; u++) {
          if (grid[k][u][0] == 'J' &&
              (grid[k][u][1] == '1' || grid[k][u][1] == '2')) {
            res++;
            a = grid[k][u][1] - '0';
            continue;
          }
          col.insert(grid[k][u][1]);
          num.insert(grid[k][u][0]);
        }
      }
      if (res == 0) {
        if (col.size() == 1 || num.size() == 9) {
          ok[i][j] = 1;
        }
      } else if (res == 1) {
        dp[i][j] = a;
        if (col.size() > 1 && num.size() < 8) {
          continue;
        }
        if (col.size() == 1) {
          for (auto t : cards) {
            if (t[1] == *col.begin()) {
              tab[i][j].insert(t);
            }
          }
        }
        if (num.size() == 8) {
          for (auto t : cards) {
            if (num.count(t[0]) == 0) {
              tab[i][j].insert(t);
            }
          }
        }
        ok[i][j] = (tab[i][j].size() >= 1);
      } else if (res == 2) {
        dp[i][j] = 3;
        if (col.size() > 1 && num.size() < 7) {
          continue;
        }
        if (col.size() == 1) {
          for (auto t : cards) {
            for (auto p : cards) {
              if (t == p) continue;
              if (t[1] != *col.begin() || p[1] != *col.begin()) continue;
              tab[i][j].insert(t + " " + p);
            }
          }
        }
        if (num.size() == 7) {
          for (auto t : cards) {
            for (auto p : cards) {
              if (t[0] == p[0]) continue;
              if (num.count(t[0]) || num.count(p[0])) continue;
              tab[i][j].insert(t + " " + p);
            }
          }
        }
        ok[i][j] = (tab[i][j].size() >= 1);
      }
    }
  }
  bool flag = false;
  for (int i = 0; i < n - 2; i++) {
    if (flag) break;
    for (int j = 0; j < m - 2; j++) {
      if (flag) break;
      if (ok[i][j] == 0) continue;
      for (int u = 0; u < n - 2; u++) {
        if (flag) break;
        for (int k = 0; k < m - 2; k++) {
          if (flag) break;
          if (k >= j - 2 && k <= j + 2 && u >= i - 2 && u <= i + 2) continue;
          if (ok[u][k]) {
            if (dp[u][k] == 0 && dp[i][j] == 0) {
              flag = true;
              a = i;
              b = j;
              c = u;
              d = k;
              break;
            } else if (dp[i][j] != 0 && dp[u][k] == 0) {
              flag = true;
              a = i;
              b = j;
              c = u;
              d = k;
              if (dp[i][j] == 1) j11 = *(tab[i][j]).begin();
              if (dp[i][j] == 2) j22 = *(tab[i][j]).begin();
              if (dp[i][j] == 3) {
                j11 = (*(tab[i][j]).begin()).substr(0, 2);
                j22 = (*(tab[i][j]).begin()).substr(3, 2);
              }
            } else if (dp[i][j] == 0 && dp[u][k] != 0) {
              flag = true;
              a = i;
              b = j;
              c = u;
              d = k;
              if (dp[u][k] == 1) j11 = *(tab[u][k]).begin();
              if (dp[u][k] == 2) j22 = *(tab[u][k]).begin();
              if (dp[u][k] == 3) {
                j11 = (*(tab[u][k]).begin()).substr(0, 2);
                j22 = (*(tab[u][k]).begin()).substr(3, 2);
              }
            } else if (dp[i][j] == 1 && dp[u][k] == 2) {
              for (auto t : tab[i][j]) {
                if (flag) break;
                for (auto r : tab[u][k]) {
                  if (t != r) {
                    j11 = t;
                    j22 = r;
                    flag = true;
                    a = i;
                    b = j;
                    c = u;
                    d = k;
                    break;
                  }
                }
              }
            } else if (dp[u][k] == 1 && dp[i][j] == 2) {
              for (auto t : tab[i][j]) {
                if (flag) break;
                for (auto r : tab[u][k]) {
                  if (t != r) {
                    j11 = r;
                    j22 = t;
                    flag = true;
                    a = i;
                    b = j;
                    c = u;
                    d = k;
                    break;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  if (flag == false) {
    cout << "No solution.";
    return 0;
  }
  if (j22 != "") cards.erase(j22);
  if (j11 != "") cards.erase(j11);
  if (j3) {
    if (j11 == "")
      for (auto t : cards) {
        j11 = t;
        cards.erase(t);
        break;
      }
    if (j11 == "") {
      cout << "No solution.";
      return 0;
    }
  }
  if (j2) {
    if (j22 == "")
      for (auto t : cards) {
        j22 = t;
        cards.erase(t);
        break;
      }
    if (j22 == "") {
      cout << "No solution.";
      return 0;
    }
    cards.erase(j11);
  }
  cout << "Solution exists." << endl;
  if (j3 && j2) {
    cout << "Replace J1 with " + j11 + " and J2 with " + j22 + "." << endl;
  } else if (j3) {
    cout << "Replace J1 with " + j11 + "." << endl;
  } else if (j2) {
    cout << "Replace J2 with " + j22 + "." << endl;
  } else {
    cout << "There are no jokers." << endl;
  }
  cout << "Put the first square to (" << a + 1 << ", " << b + 1 << ")." << endl;
  cout << "Put the second square to (" << c + 1 << ", " << d + 1 << ")."
       << endl;
  return 0;
}
