#include <bits/stdc++.h>
using namespace std;
vector<char> Rank, suit;
vector<string> card, out;
vector<pair<int, int>> jokers;
map<string, bool> mapp;
void pre() {
  for (char i = '2'; i <= '9'; i++) Rank.push_back(i);
  Rank.push_back('T');
  Rank.push_back('J');
  Rank.push_back('Q');
  Rank.push_back('K');
  Rank.push_back('A');
  suit.push_back('C');
  suit.push_back('D');
  suit.push_back('H');
  suit.push_back('S');
  string temp;
  for (int i = 0; i < (int)Rank.size(); i++)
    for (int j = 0; j < (int)suit.size(); j++) {
      temp = Rank[i];
      temp += suit[j];
      card.push_back(temp);
    }
}
vector<vector<string>> vec;
vector<pair<int, int>> sol(2);
bool check() {
  vector<pair<int, int>> indx;
  for (int i = 0; i < (int)vec.size() - 2; i++) {
    for (int j = 0; j < (int)vec[i].size() - 2; j++) {
      set<char> ranks, suits;
      for (int k = i; k <= i + 2; k++) {
        for (int w = j; w <= j + 2; w++) {
          ranks.insert(vec[k][w][0]);
          suits.insert(vec[k][w][1]);
        }
      }
      if (ranks.size() == 9 || suits.size() == 1)
        indx.push_back(make_pair(i, j));
    }
  }
  for (int i = 0; i < (int)indx.size(); i++) {
    for (int j = 0; j < (int)indx.size(); j++) {
      if (indx[i].first - indx[j].first >= 3 ||
          indx[i].second - indx[j].second >= 3) {
        sol[0] = indx[i], sol[1] = indx[j];
        return 1;
      }
    }
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  pre();
  int n, m;
  cin >> n >> m;
  vec.resize(n);
  for (int i = 0; i < (int)n; i++) {
    vec[i].resize(m);
    for (int j = 0; j < (int)m; j++) {
      cin >> vec[i][j];
      if (vec[i][j][0] == 'J' && (vec[i][j][1] == '1' || vec[i][j][1] == '2'))
        jokers.push_back(make_pair(i, j));
      mapp[vec[i][j]] = 1;
    }
  }
  if (!mapp["J1"] && !mapp["J2"]) {
    if (check()) {
      cout << "Solution exists.\nThere are no jokers.\n";
      cout << "Put the first square to (" << sol[0].first + 1 << ", "
           << sol[0].second + 1 << ").\n";
      cout << "Put the second square to (" << sol[1].first + 1 << ", "
           << sol[1].second + 1 << ").\n";
    } else {
      cout << "No solution." << endl;
    }
    return 0;
  }
  for (int i = 0; i < (int)card.size(); i++)
    if (!mapp[card[i]]) out.push_back(card[i]);
  string temp = vec[jokers[0].first][jokers[0].second];
  string temp1;
  if (jokers.size() > 1) temp1 = vec[jokers[1].first][jokers[1].second];
  for (int i = 0; i < (int)out.size(); i++) {
    vec[jokers[0].first][jokers[0].second] = out[i];
    if (jokers.size() == 2) {
      for (int j = 0; j < (int)out.size(); j++) {
        if (i == j) continue;
        vec[jokers[1].first][jokers[1].second] = out[j];
        if (check()) {
          if (temp == "J1")
            cout << "Solution exists.\nReplace " << temp << " with " << out[i]
                 << " and " << temp1 << " with " << out[j] << ".\n";
          else
            cout << "Solution exists.\nReplace " << temp1 << " with " << out[j]
                 << " and " << temp << " with " << out[i] << ".\n";
          cout << "Put the first square to (" << sol[0].first + 1 << ", "
               << sol[0].second + 1 << ").\n";
          cout << "Put the second square to (" << sol[1].first + 1 << ", "
               << sol[1].second + 1 << ").\n";
          return 0;
        }
      }
    } else {
      if (check()) {
        cout << "Solution exists.\nReplace " << temp << " with " << out[i]
             << ".\n";
        cout << "Put the first square to (" << sol[0].first + 1 << ", "
             << sol[0].second + 1 << ").\n";
        cout << "Put the second square to (" << sol[1].first + 1 << ", "
             << sol[1].second + 1 << ").\n";
        return 0;
      }
    }
  }
  cout << "No solution." << endl;
  return 0;
}
