#include <bits/stdc++.h>
using namespace std;
int n, m;
string s[70][70];
vector<string> ve;
map<string, int> ma;
int larara;
int klj[80][80];
int fla[10000];
int kla = 0;
vector<pair<int, int> > votv;
int cnt[80][80];
int main() {
  string s1 = "23456789TJQKA";
  string s2 = "CDHS";
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < s1.size(); i++)
    for (int j = 0; j < s2.size(); j++) {
      string s3;
      s3 = s1[i];
      string s4;
      s4 = s2[j];
      s3 = s3 + s4;
      ma[s3] = 1;
    }
  int kljok = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      cin >> s[i][j];
      ma[s[i][j]] = 0;
      if (s[i][j] == "J1" || s[i][j] == "J2") kljok++;
      if (s[i][j] == "J1") larara = 1;
    }
  for (int i = 0; i < s1.size(); i++)
    for (int j = 0; j < s2.size(); j++) {
      string s3;
      s3 = s1[i];
      string s4;
      s4 = s2[j];
      s3 = s3 + s4;
      if (ma[s3] == 1) ve.push_back(s3);
    }
  for (int i = 0; i < n - 2; i++)
    for (int j = 0; j < m - 2; j++) {
      map<char, int> mra;
      int f1 = 0, f2 = 0;
      int kj = 0;
      for (int i1 = 0; i1 < 3; i1++)
        for (int j1 = 0; j1 < 3; j1++) {
          if (s[i + i1][j + j1] != "J1" && s[i + i1][j + j1] != "J2") {
            if (mra[s[i + i1][j + j1][0]] == 0)
              mra[s[i + i1][j + j1][0]]++;
            else
              f1 = 1;
            if (mra[s[i + i1][j + j1][1]] == 0) {
              mra[s[i + i1][j + j1][1]] = 1;
              f2++;
            }
          } else if (s[i + i1][j + j1] == "J1")
            kj++;
          else if (s[i + i1][j + j1] == "J2")
            kj += 2;
        }
      klj[i][j] = kj;
      if (f1 == 0 || f2 == 1) {
        votv.push_back(make_pair(i, j));
      }
    }
  for (int i = 0; i < votv.size(); i++)
    if (votv.size() < 2) {
      cout << "No solution.";
      return 0;
    }
  string jock1 = "", jock2 = "";
  int nom1 = -1, nom2 = -1;
  for (int i = 0; i < votv.size(); i++) {
    if (nom1 != -1 && nom2 != -1) break;
    jock1 = "";
    jock2 = "";
    for (int j = i + 1; j < votv.size(); j++) {
      if (nom1 != -1 && nom2 != -1) break;
      jock1 = "", jock2 = "";
      for (int ra = 0; ra < ve.size(); ra++) fla[i] = 0;
      nom1 = -1;
      nom2 = -1;
      int x = votv[i].first;
      int y = votv[i].second;
      int x1 = votv[j].first;
      int y1 = votv[j].second;
      if (abs(x - x1) > 2 || abs(y - y1) > 2) {
        if (klj[x][y] == 0 && klj[x1][y1] == 0) {
          nom1 = i;
          nom2 = j;
          int lar = 1;
          for (int l = 0; l < ve.size(); l++)
            if (lar == 1) {
              jock1 = ve[l];
              lar++;
            } else if (kljok == 1)
              break;
            else {
              jock2 = ve[l];
              break;
            }
          break;
        }
        if (klj[x][y] != 0 && klj[x][y] != 3) {
          int f1 = 0, f2 = 0;
          map<char, int> mra;
          for (int i1 = 0; i1 < 3; i1++)
            for (int j1 = 0; j1 < 3; j1++) {
              if (s[x + i1][y + j1] != "J1" && s[x + i1][y + j1] != "J2") {
                if (mra[s[x + i1][y + j1][0]] == 0)
                  mra[s[x + i1][y + j1][0]]++;
                else
                  f1 = 1;
                if (mra[s[x + i1][y + j1][1]] == 0) {
                  mra[s[x + i1][y + j1][1]] = 1;
                  f2++;
                }
              }
            }
          if (f2 == 1) {
            char r;
            if (s[x][y] != "J1" && s[x][y] != "J2")
              r = s[x][y][1];
            else if (s[x][y + 1] != "J1" && s[x][y] != "J2")
              r = s[x][y + 1][1];
            else
              r = s[x + 1][y][1];
            for (int l = 0; l < ve.size(); l++)
              if (ve[l][1] == r && fla[l] == 0) {
                jock1 = ve[l];
                fla[l] = 1;
                break;
              }
          }
          if (f1 == 0) {
            for (int l = 0; l < ve.size(); l++)
              if (mra[ve[l][0]] == 0 && fla[l] == 0) {
                jock1 = ve[l];
                fla[l] = 1;
                break;
              }
          }
        }
        if (klj[x1][y1] != 0 && klj[x1][y1] != 3) {
          int f1 = 0, f2 = 0;
          map<char, int> mra;
          for (int i1 = 0; i1 < 3; i1++)
            for (int j1 = 0; j1 < 3; j1++) {
              if (s[x1 + i1][y1 + j1] != "J1" && s[x1 + i1][y1 + j1] != "J2") {
                if (mra[s[x1 + i1][y1 + j1][0]] == 0)
                  mra[s[x1 + i1][y1 + j1][0]]++;
                else
                  f1 = 1;
                if (mra[s[x1 + i1][y1 + j1][1]] == 0) {
                  mra[s[x1 + i1][y1 + j1][1]] = 1;
                  f2++;
                }
              }
            }
          if (f2 == 1) {
            char r;
            if (s[x1][y1] != "J1" && s[x1][y1] != "J2")
              r = s[x1][y1][1];
            else if (s[x1][y1 + 1] != "J1" && s[x1][y1] != "J2")
              r = s[x1][y1 + 1][1];
            else
              r = s[x1 + 1][y1][1];
            for (int l = 0; l < ve.size(); l++)
              if (ve[l][1] == r && fla[l] == 0) {
                jock2 = ve[l];
                fla[l] = 1;
                break;
              }
          }
          if (f1 == 0) {
            for (int l = 0; l < ve.size(); l++)
              if (mra[ve[l][0]] == 0 && fla[l] == 0) {
                jock2 = ve[l];
                fla[l] = 1;
                if (i == 0 && j == 3) break;
              }
          }
        }
        if (klj[x][y] == 3) {
          int f1 = 0, f2 = 0;
          map<char, int> mra;
          for (int i1 = 0; i1 < 3; i1++)
            for (int j1 = 0; j1 < 3; j1++) {
              if (s[x + i1][y + y1] != "J1" && s[x + i1][y + j1] != "J2") {
                if (mra[s[x + i1][y + j1][0]] == 0)
                  mra[s[x + i1][y + j1][0]]++;
                else
                  f1 = 1;
                if (mra[s[x + i1][y + j1][1]] == 0) {
                  mra[s[x + i1][y + j1][1]] = 1;
                  f2++;
                }
              }
            }
          if (f2 == 1) {
            char r;
            int lrr = 1;
            if (s[x][y] != "J1" && s[x][y] != "J2")
              r = s[x][y][1];
            else if (s[x][y + 1] != "J1" && s[x][y] != "J2")
              r = s[x][y + 1][1];
            else
              r = s[x + 1][y][1];
            for (int l = 0; l < ve.size(); l++)
              if (ve[l][1] == r) {
                if (lrr == 1) {
                  jock1 = ve[l];
                  lrr++;
                } else {
                  jock2 = ve[l];
                  break;
                }
              }
          }
          if (f1 == 0) {
            int lrr = 1;
            for (int l = 0; l < ve.size(); l++)
              if (mra[ve[l][0]] == 0) {
                if (lrr == 1) {
                  jock1 = ve[l];
                  lrr++;
                  mra[ve[l][0]] = 1;
                } else {
                  jock2 = ve[l];
                  break;
                }
              }
          }
        }
        if (klj[x1][y1] == 3) {
          int f1 = 0, f2 = 0;
          map<char, int> mra;
          for (int i1 = 0; i1 < 3; i1++)
            for (int j1 = 0; j1 < 3; j1++) {
              if (s[x1 + i1][y1 + j1] != "J1" && s[x1 + i1][y1 + j1] != "J2") {
                if (mra[s[x1 + i1][y1 + j1][0]] == 0)
                  mra[s[x1 + i1][y1 + j1][0]]++;
                else
                  f1 = 1;
                if (mra[s[x1 + i1][y1 + j1][1]] == 0) {
                  mra[s[x1 + i1][y1 + j1][1]] = 1;
                  f2++;
                }
              }
            }
          if (f2 == 1) {
            char r;
            int lrr = 1;
            if (s[x1][y1] != "J1" && s[x1][y1] != "J2")
              r = s[x1][y1][1];
            else if (s[x1][y1 + 1] != "J1" && s[x1][y1] != "J2")
              r = s[x1][y1 + 1][1];
            else
              r = s[x1 + 1][y1][1];
            for (int l = 0; l < ve.size(); l++)
              if (ve[l][1] == r) {
                if (lrr == 1) {
                  jock1 = ve[l];
                  lrr++;
                } else {
                  jock2 = ve[l];
                  break;
                }
              }
          }
          if (f1 == 0) {
            int lrr = 1;
            for (int l = 0; l < ve.size(); l++)
              if (mra[ve[l][0]] == 0) {
                if (lrr == 1) {
                  jock1 = ve[l];
                  lrr++;
                  mra[ve[l][0]] = 1;
                } else {
                  jock2 = ve[l];
                  break;
                }
              }
          }
        }
        if (kljok == 2 && jock1 != "" && jock2 != "") {
          nom1 = i;
          nom2 = j;
          break;
        } else if (kljok == 1 && ((jock1 != "") || jock2 != "")) {
          nom1 = i;
          nom2 = j;
          break;
        } else if (kljok == 0) {
          nom1 = i;
          nom2 = j;
          break;
        } else if ((jock1 != "" && klj[x1][y1] == 0) ||
                   (jock2 != "" && klj[x][y] == 0)) {
          nom1 = i;
          nom2 = j;
          for (int l = 0; l < ve.size(); l++)
            if (fla[l] == 0) {
              if (jock1 == "")
                jock1 = ve[l];
              else
                jock2 = ve[l];
              fla[l] = 1;
              break;
            }
          break;
        }
      }
    }
  }
  if (nom1 == -1 || nom2 == -1) {
    cout << "No solution.";
    return 0;
  }
  cout << "Solution exists." << endl;
  if (kljok == 0) {
    cout << "There are no jokers." << endl;
  }
  if (kljok == 1) {
    if (jock1 == "") {
      string sr = "";
      if (klj[votv[nom2].first][votv[nom2].second] == 1)
        sr = "J1";
      else
        sr = "J2";
      if (kljok == 1 && larara == 1)
        sr = "J1";
      else
        sr = "J2";
      cout << "Replace " << sr << " with " << jock2 << '.' << endl;
    } else {
      string sr = "";
      if (klj[votv[nom1].first][votv[nom1].second] == 1)
        sr = "J1";
      else
        sr = "J2";
      if (kljok == 1 && larara == 1)
        sr = "J1";
      else
        sr = "J2";
      cout << "Replace " << sr << " with " << jock1 << '.' << endl;
    }
  }
  string sr;
  string srr;
  if (kljok == 2) {
    if (klj[votv[nom1].first][votv[nom1].second] == 1)
      sr = "J1";
    else if (klj[votv[nom1].first][votv[nom1].second] == 2)
      sr = "J2";
    else if (klj[votv[nom2].first][votv[nom2].second] == 1)
      sr = "J2";
    else
      sr = "J1";
    if (sr == "J2")
      srr = "J1";
    else
      srr = "J2";
    if (sr == "J1")
      cout << "Replace " << sr << " with " << jock1 << " and " << srr
           << " with " << jock2 << '.' << endl;
    else
      cout << "Replace " << srr << " with " << jock2 << " and " << sr
           << " with " << jock1 << '.' << endl;
  }
  cout << "Put the first square to (" << votv[nom1].first + 1 << ", "
       << votv[nom1].second + 1 << ")." << endl;
  cout << "Put the second square to (" << votv[nom2].first + 1 << ", "
       << votv[nom2].second + 1 << ")." << endl;
}
