#include <bits/stdc++.h>
using namespace std;
void println() { cout << '\n'; }
template <typename Head, typename... Tail>
void println(Head H, Tail... T) {
  cout << " " << H;
  println(T...);
}
void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << H;
  debug_out(T...);
}
const int INF = 1e9;
const long long MOD = 1e9 + 7;
int n, m;
int s1x, s1y, s2x, s2y;
int j1x, j1y, j2x, j2y;
vector<vector<string> > board;
bool issquareok(int i, int j) {
  vector<char> suits;
  vector<char> ranks;
  for (int p = int(0); p <= int(2); p++) {
    for (int q = int(0); q <= int(2); q++) {
      ranks.push_back(board[i + p][j + q][0]);
      suits.push_back(board[i + p][j + q][1]);
    }
  }
  sort(suits.begin(), suits.end());
  sort(ranks.begin(), ranks.end());
  (suits).resize(unique(suits.begin(), suits.end()) - (suits).begin());
  (ranks).resize(unique(ranks.begin(), ranks.end()) - (ranks).begin());
  return suits.size() == 1 || ranks.size() == 9;
}
bool check() {
  int okcnt = 0;
  for (int i = 0; i <= n - 3; i++) {
    for (int j = 0; j <= m - 3; j++) {
      for (int k = i + 3; k <= n - 3; k++) {
        for (int l = j + 3; l <= m - 3; l++) {
          if (issquareok(i, j) && issquareok(k, l)) {
            s1x = i;
            s1y = j;
            s2x = k;
            s2y = l;
            return true;
          }
        }
      }
      for (int k = i + 3; k <= n - 3; k++) {
        for (int l = 0; l <= m - 3; l++) {
          if (issquareok(i, j) && issquareok(k, l)) {
            s1x = i;
            s1y = j;
            s2x = k;
            s2y = l;
            return true;
          }
        }
      }
      for (int k = 0; k <= n - 3; k++) {
        for (int l = j + 3; l <= m - 3; l++) {
          if (issquareok(i, j) && issquareok(k, l)) {
            s1x = i;
            s1y = j;
            s2x = k;
            s2y = l;
            return true;
          }
        }
      }
    }
  }
  return false;
}
void print_answer() {
  cout << "Solution exists.\n";
  if (j1x >= 0 && j2x >= 0)
    cout << "Replace J1 with " << board[j1x][j1y] << " and J2 with "
         << board[j2x][j2y] << ".\n";
  else if (j1x >= 0)
    cout << "Replace J1 with " << board[j1x][j1y] << ".\n";
  else if (j2x >= 0)
    cout << "Replace J2 with " << board[j2x][j2y] << ".\n";
  else
    cout << "There are no jokers.\n";
  printf("Put the first square to (%d, %d).\n", s1x + 1, s1y + 1);
  printf("Put the second square to (%d, %d).\n", s2x + 1, s2y + 1);
}
int main() {
  j1x = j1y = j2x = j2y = -1;
  s1x = s1y = s2x = s2y = -1;
  cin >> n >> m;
  board.assign(n, vector<string>(m));
  vector<vector<bool> > present(13, vector<bool>(4, false));
  for (int i = int(0); i <= int(n - 1); i++)
    for (int j = int(0); j <= int(m - 1); j++) {
      cin >> board[i][j];
      if (board[i][j] == "J1") {
        j1x = i;
        j1y = j;
      } else if (board[i][j] == "J2") {
        j2x = i;
        j2y = j;
      } else {
        char rank = board[i][j][0], suit = board[i][j][1];
        int r, s;
        if (rank >= '0' && rank <= '9')
          r = rank - '0';
        else
          switch (rank) {
            case 'A':
              r = 1;
              break;
            case 'T':
              r = 10;
              break;
            case 'J':
              r = 11;
              break;
            case 'Q':
              r = 12;
              break;
            case 'K':
              r = 13;
              break;
          }
        switch (suit) {
          case 'C':
            s = 1;
            break;
          case 'D':
            s = 2;
            break;
          case 'H':
            s = 3;
            break;
          case 'S':
            s = 4;
            break;
        }
        present[r - 1][s - 1] = true;
      }
    }
  vector<string> notpresent;
  for (int i = int(0); i <= int(12); i++) {
    for (int j = int(0); j <= int(3); j++) {
      if (!present[i][j]) {
        string card = "";
        if (i + 1 >= 2 && i + 1 <= 9)
          card += i + 1 + '0';
        else
          switch (i + 1) {
            case 1:
              card += 'A';
              break;
            case 10:
              card += 'T';
              break;
            case 11:
              card += 'J';
              break;
            case 12:
              card += 'Q';
              break;
            case 13:
              card += 'K';
              break;
          }
        switch (j + 1) {
          case 1:
            card += 'C';
            break;
          case 2:
            card += 'D';
            break;
          case 3:
            card += 'H';
            break;
          case 4:
            card += 'S';
            break;
        }
        notpresent.push_back(card);
      }
    }
  }
  int np = notpresent.size();
  if (j1x >= 0 && j2x >= 0) {
    for (int i = int(0); i <= int(np - 1); i++) {
      for (int j = int(i + 1); j <= int(np - 1); j++) {
        board[j1x][j1y] = notpresent[i];
        board[j2x][j2y] = notpresent[j];
        if (check()) {
          print_answer();
          return 0;
        }
        board[j1x][j1y] = notpresent[j];
        board[j2x][j2y] = notpresent[i];
        if (check()) {
          print_answer();
          return 0;
        }
      }
    }
  } else if (j1x >= 0) {
    for (int i = int(0); i <= int(np - 1); i++) {
      board[j1x][j1y] = notpresent[i];
      if (check()) {
        print_answer();
        return 0;
      }
    }
  } else if (j2x >= 0) {
    for (int i = int(0); i <= int(np - 1); i++) {
      board[j2x][j2y] = notpresent[i];
      if (check()) {
        print_answer();
        return 0;
      }
    }
  } else if (check()) {
    print_answer();
    return 0;
  }
  cout << "No solution.\n";
  return 0;
}
