#include <bits/stdc++.h>
using namespace std;
int n, m;
string s[100][100];
inline pair<pair<int, int>, pair<int, int> > check() {
  vector<pair<int, int> > vec;
  for (int i = 1; i + 2 <= n; i++) {
    for (int j = 1; j + 2 <= m; j++) {
      set<int> s1, s2;
      for (int x = 0; x < 3; x++) {
        for (int y = 0; y < 3; y++) {
          s1.insert(s[i + x][j + y][0]);
          s2.insert(s[i + x][j + y][1]);
        }
      }
      if (s1.size() == 9 || s2.size() == 1) {
        for (auto pp : vec) {
          if (abs(pp.first - i) >= 3 || abs(pp.second - j) >= 3) {
            return {pp, {i, j}};
          }
        }
        vec.push_back({i, j});
      }
    }
  }
  return {{-1, -1}, {-1, -1}};
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout << setprecision(32);
  cin >> n >> m;
  set<string> st;
  pair<int, int> jok1({-1, -1});
  pair<int, int> jok2({-1, -1});
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> s[i][j];
      if (s[i][j] == "J1")
        jok1 = {i, j};
      else if (s[i][j] == "J2")
        jok2 = {i, j};
      else
        st.insert(s[i][j]);
    }
  }
  vector<string> vec;
  for (string ff :
       {"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"}) {
    for (string ss : {"C", "D", "H", "S"}) {
      string tmp = ff + ss;
      if (!st.count(tmp)) vec.push_back(tmp);
    }
  }
  if (jok1.first == -1 && jok2.first == -1) {
    pair<pair<int, int>, pair<int, int> > pp = check();
    if (pp.first.first == -1) {
      cout << "No solution.";
    } else {
      cout << "Solution exists.\n";
      cout << "There are no jokers.\n";
      cout << "Put the first square to (" << pp.first.first << ", "
           << pp.first.second << ").\n";
      cout << "Put the second square to (" << pp.second.first << ", "
           << pp.second.second << ").\n";
    }
    exit(0);
  }
  if (jok1.first == -1) {
    for (int i = 0; i < vec.size(); i++) {
      s[jok2.first][jok2.second] = vec[i];
      pair<pair<int, int>, pair<int, int> > pp = check();
      if (pp.first.first != -1) {
        cout << "Solution exists.\n";
        cout << "Replace J2 with " << vec[i] << ".\n";
        cout << "Put the first square to (" << pp.first.first << ", "
             << pp.first.second << ").\n";
        cout << "Put the second square to (" << pp.second.first << ", "
             << pp.second.second << ").\n";
        exit(0);
      }
    }
    cout << "No solution.";
    exit(0);
  }
  if (jok2.first == -1) {
    for (int i = 0; i < vec.size(); i++) {
      s[jok1.first][jok1.second] = vec[i];
      pair<pair<int, int>, pair<int, int> > pp = check();
      if (pp.first.first != -1) {
        cout << "Solution exists.\n";
        cout << "Replace J1 with " << vec[i] << ".\n";
        cout << "Put the first square to (" << pp.first.first << ", "
             << pp.first.second << ").\n";
        cout << "Put the second square to (" << pp.second.first << ", "
             << pp.second.second << ").\n";
        exit(0);
      }
    }
    cout << "No solution.";
    exit(0);
  }
  for (int i1 = 0; i1 < vec.size(); i1++) {
    for (int i2 = 0; i2 < vec.size(); i2++) {
      if (i1 == i2) continue;
      s[jok1.first][jok1.second] = vec[i1];
      s[jok2.first][jok2.second] = vec[i2];
      pair<pair<int, int>, pair<int, int> > pp = check();
      if (pp.first.first != -1) {
        cout << "Solution exists.\n";
        cout << "Replace J1 with " << vec[i1] << " and J2 with " << vec[i2]
             << ".\n";
        cout << "Put the first square to (" << pp.first.first << ", "
             << pp.first.second << ").\n";
        cout << "Put the second square to (" << pp.second.first << ", "
             << pp.second.second << ").\n";
        exit(0);
      }
    }
  }
  cout << "No solution.";
  return 0;
}
