#include <bits/stdc++.h>
using namespace std;
template <class T>
using min_heap = priority_queue<T, vector<T>, greater<T>>;
template <class T>
inline void MAX(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void MIN(T &a, T b) {
  if (a > b) a = b;
}
template <class T>
inline void MODA(T &a, T b) {
  a %= b;
  if (a < 0) a += b;
}
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const int NINF = -0x3f3f3f40;
const int MAXN = 20;
int n, m, num;
vector<pair<int, int>> jokers;
vector<pair<char, char>> repl;
pair<char, char> grid[MAXN][MAXN];
bool overlaps(int i, int j, int k, int l) {
  bool used[n][m];
  memset(used, false, sizeof used);
  for (int(a) = (i - 2); (a) < (i + 1); ++(a))
    for (int(b) = (j - 2); (b) < (j + 1); ++(b)) used[a][b] = true;
  for (int(a) = (k - 2); (a) < (k + 1); ++(a))
    for (int(b) = (l - 2); (b) < (l + 1); ++(b))
      if (used[a][b]) return true;
  return false;
}
bool isValid() {
  for (int(i) = (2); (i) < (n); ++(i)) {
    for (int(j) = (2); (j) < (m); ++(j)) {
      for (int(k) = (2); (k) < (n); ++(k)) {
        for (int(l) = (2); (l) < (m); ++(l)) {
          if (overlaps(i, j, k, l)) continue;
          set<char> seen;
          bool bad = false;
          int currSuit = -1;
          for (int(a) = (i - 2); (a) < (i + 1); ++(a))
            for (int(b) = (j - 2); (b) < (j + 1); ++(b)) {
              pair<char, char> card = grid[a][b];
              if (seen.count(card.first)) bad = true;
              seen.insert(card.first);
              if (currSuit == -1) currSuit = card.second;
              if (currSuit != card.second) currSuit = -2;
            }
          if (currSuit == -2 && bad) continue;
          bad = false;
          currSuit = -1;
          seen.clear();
          for (int(a) = (k - 2); (a) < (k + 1); ++(a))
            for (int(b) = (l - 2); (b) < (l + 1); ++(b)) {
              pair<char, char> card = grid[a][b];
              if (seen.count(card.first)) bad = true;
              seen.insert(card.first);
              if (currSuit == -1) currSuit = card.second;
              if (currSuit != card.second) currSuit = -2;
            }
          if (currSuit == -2 && bad) continue;
          cout << "Solution exists." << '\n';
          if (repl.size()) {
            if (repl.size() == 1)
              cout << "Replace J" << num << " with " << repl[0].first
                   << repl[0].second << ".\n";
            else
              cout << "Replace J1 with " << repl[0].first << repl[0].second
                   << " and J2 with " << repl[1].first << repl[1].second
                   << ".\n";
          } else {
            cout << "There are no jokers." << '\n';
          }
          cout << "Put the first square to (" << i - 1 << ", " << j - 1 << ")."
               << '\n';
          cout << "Put the second square to (" << k - 1 << ", " << l - 1 << ")."
               << '\n';
          exit(0);
        }
      }
    }
  }
  return false;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.precision(20);
  cin >> n >> m;
  set<pair<char, char>> cards;
  set<char> suits{'C', 'D', 'H', 'S'};
  char type[]{'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
  for (char ty : type)
    for (char su : suits) cards.insert(make_pair(ty, su));
  for (int(i) = 0; (i) < (n); ++(i)) {
    for (int(j) = 0; (j) < (m); ++(j)) {
      string str;
      cin >> str;
      grid[i][j].first = str[0];
      grid[i][j].second = str[1];
      if (!suits.count(str[1])) jokers.push_back(make_pair(i, j));
      cards.erase(make_pair(str[0], str[1]));
    }
  }
  if (jokers.size() == 0) isValid();
  if (jokers.size() == 1) {
    num = grid[jokers[0].first][jokers[0].second].second - '0';
    for (auto card : cards) {
      grid[jokers[0].first][jokers[0].second] = card;
      repl.push_back(card);
      isValid();
      repl.clear();
    }
  }
  if (jokers.size() == 2) {
    if (grid[jokers[0].first][jokers[0].second] != make_pair('J', '1'))
      swap(jokers[0], jokers[1]);
    for (auto card : cards) {
      for (auto card2 : cards) {
        auto n1 = card;
        auto n2 = card2;
        if (card == card2) continue;
        grid[jokers[0].first][jokers[0].second] = n1;
        grid[jokers[1].first][jokers[1].second] = n2;
        repl.push_back(n1);
        repl.push_back(n2);
        isValid();
        repl.clear();
      }
    }
  }
  cout << "No solution." << '\n';
}
