#include <bits/stdc++.h>
using namespace std;
int a[17][17];
const int maxN = 52;
int used[maxN];
int ff[maxN];
int abs_(int x) { return max(x, -x); }
int n, m;
int ctim = 0;
int check(int i, int j) {
  int o = a[i][j] / 13;
  ctim++;
  int f1 = 1;
  int f2 = 1;
  for (int di = 0; di < 3; di++) {
    for (int dj = 0; dj < 3; dj++) {
      int ii = i + di;
      int jj = j + dj;
      int g = a[ii][jj] % 13;
      if (ff[g] == ctim) {
        f1 = 0;
      }
      ff[g] = ctim;
      if (a[ii][jj] / 13 != o) {
        f2 = 0;
      }
    }
  }
  return f2 | f1;
}
int ii1, jj1, ii2, jj2;
int check() {
  for (int i1 = 0; i1 + 2 < n; i1++) {
    for (int j1 = 0; j1 + 2 < m; j1++) {
      for (int i2 = 0; i2 + 2 < n; i2++) {
        for (int j2 = 0; j2 + 2 < m; j2++) {
          if (max(abs_(i1 - i2), abs_(j2 - j1)) <= 2) {
            continue;
          }
          if (check(i1, j1) && check(i2, j2)) {
            ii1 = i1 + 1;
            jj1 = j1 + 1;
            ii2 = i2 + 1;
            jj2 = j2 + 1;
            return 1;
          }
        }
      }
    }
  }
  return 0;
}
int main() {
  string R = "23456789TJQKA";
  string S = "CDHS";
  map<string, int> id;
  vector<string> cards;
  for (auto y : S) {
    for (auto x : R) {
      string cur = "xy";
      cur[0] = x;
      cur[1] = y;
      cards.push_back(cur);
    }
  }
  cards.push_back("J1");
  cards.push_back("J2");
  for (int i = 0; i < cards.size(); i++) {
    id[cards[i]] = i;
  }
  cin >> n >> m;
  int i1 = -1, j1 = -1, i2 = -1, j2 = -1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      string s;
      cin >> s;
      if (s == "J1") {
        i1 = i;
        j1 = j;
        continue;
      }
      if (s == "J2") {
        i2 = i;
        j2 = j;
        continue;
      }
      a[i][j] = id[s];
      used[id[s]] = 1;
    }
  }
  vector<int> unused;
  for (int i = 0; i < 52; i++) {
    if (!used[i]) {
      unused.push_back(i);
    }
  }
  if (i1 == -1 && i2 == -1) {
    if (check()) {
      cout << "Solution exists." << endl;
      cout << "There are no jokers." << endl;
      cout << "Put the first square to (" << ii1 << ", " << jj1 << ")." << endl;
      cout << "Put the second square to (" << ii2 << ", " << jj2 << ")."
           << endl;
      return 0;
    }
  } else if (i1 == -1 && i2 != -1) {
    for (auto x : unused) {
      a[i2][j2] = x;
      if (check()) {
        cout << "Solution exists." << endl;
        cout << "Replace J2 with " << cards[x] << "." << endl;
        cout << "Put the first square to (" << ii1 << ", " << jj1 << ")."
             << endl;
        cout << "Put the second square to (" << ii2 << ", " << jj2 << ")."
             << endl;
        return 0;
      }
    }
  } else if (i1 != -1 && i2 == -1) {
    for (auto x : unused) {
      a[i1][j1] = x;
      if (check()) {
        cout << "Solution exists." << endl;
        cout << "Replace J1 with " << cards[x] << "." << endl;
        cout << "Put the first square to (" << ii1 << ", " << jj1 << ")."
             << endl;
        cout << "Put the second square to (" << ii2 << ", " << jj2 << ")."
             << endl;
        return 0;
      }
    }
  } else {
    for (auto x : unused) {
      for (auto y : unused) {
        a[i1][j1] = x;
        a[i2][j2] = y;
        if (y == x) continue;
        if (check()) {
          cout << "Solution exists." << endl;
          cout << "Replace J1 with " << cards[x] << " and J2 with " << cards[y]
               << "." << endl;
          cout << "Put the first square to (" << ii1 << ", " << jj1 << ")."
               << endl;
          cout << "Put the second square to (" << ii2 << ", " << jj2 << ")."
               << endl;
          return 0;
        }
      }
    }
  }
  cout << "No solution." << endl;
  return 0;
}
