7 7
6C 8C KH 8S 2H 7S JH
3H QC QD TS 4C QH J2
7C 6S 6D 8D 7D 4S JS
3S 3D 9S 3C J1 2D 7H
AH KD AS 9C 2S 5D QS
2C JD 8H 9D 4D 5H 5C
JC KC 6H TH TD KS TC
 7 7
2C 3C 4C 2D 3D 4D JC
5C 6C 7C 5D 6D 7D QC
8C 9C TC 8D J2 TD KC
2H 3H 4H J1 3S 4S AC
5H 6H 7H 5S 6S 7S KH
8H 9H TH 8S 9S TS AH
JD QD KD AD JH QH AS
 3 17
3H AS 2S 9C JH JD JC QH 2C QD JS TD 5C QS 4D 5S 8D
6C QC TC KS 6D 7D AH 7C 4C 5H KD 7S 3D 4H 8S 3S KH
J2 2H 9H AD 8C 8H 4S 9D TS 6S 7H 6H 9S AC 2D 3C J1
 7 7
2C J2 5D 3C AH 6S 8H
TD 7S QD TC AD 5C 3H
3D 4H 6C 2S AC AS 7H
JS 9H JD 6D 7C 9S KS
6H 9C QC 8S 9D 4D QS
4S 5H 5S 8D JH 8C 2D
KC 4C TS TH 3S 7D QH
 7 7
QS 5C 2H JC 6C TD 2S
JD 9D 9S 7S 3H 9H 4D
AD 5H AS JH KC 5D QH
3S 8S 8H 4H AC 6D TC
2C KH TH 3C 7C JS 8C
4C 6S QC 6H 3D 7H KD
7D AH 8D TS QD 2D 4S
 6 6
J1 2D 3D 3C QH KH
4D 5D 6D AH TS QS
7D 8D JD KS AS 9S
TD 5C QD 9H TC QC
TH AD 9C KC AC 2C
KD 4C 9D 6C 7C 8C
 7 3
3H J2 4H
5H 6H 7H
8H 9H TH
2S 3S TS
2D 3D 4D
5D 6D 7D
AD KD QD
 3 3
9C TH JS
AH J1 AD
3D 4D 9D
 3 6
2H 3H 4H 5H 2S 3S
6H 7H 8H 9H 4S 5S
TH JH QH KH 6S 7S
 17 3
TH QD TC
AD 6C TS
KS 7H KC
9H 3S 2S
4D 3D 5H
4C 4S 9S
QH 2C KH
6H 8H JH
J1 5C KD
9D J2 JS
7D 9C JD
TD QS 2D
AS 3C QC
5D 8D 8S
3H 7C 8C
5S JC 2H
4H 7S 6D
 5 5
KH J2 JH 8C 5H
7S KC AC 2S KD
7H TS 6D 5C 8H
QD 2H JC QH 3S
6H TD 4H J1 8S
 3 3
4C 2C 3H
8D 8C 5S
AC 7H QH
 3 14
KH 8H 2H 2C 5C AH 2D 5D 8D 2S 5S KC 8S 5H
QH 9H 3H 3C 6C AC 3D 6D AD 3S 6S 9S JS 6H
JH TH 4H 4C 7C TC 4D 7D AS 4S 7S KS QS 7H
 7 7
2C 3C 4C 2D 3D 4D JC
5C 6C J2 5D 6D 7D QC
8C 9C TC 8D 9D TD KC
2H 3H 4H 2S 3S 4S AC
5H 6H 7H 5S 6S 7S KH
8H 9H TH 8S 9S TS AH
JD QD KD AD JH QH AS
 7 7
2C 3C 4C 2D 3D 4D JC
5C 6C 7C 5D 6D 7D QC
8C 9C TC 8D 9D TD KC
2H 3H 4H 2S 3S 4S AC
5H 6H 7H 5S 6S 7S KH
8H 9H TH 8S 9S TS AH
JD QD KD AD JH QH AS
 13 3
TH 9H 8H
7H 6H 5H
JH 3H 4H
2C 3C 4C
AH 6C 7C
8C 9C AS
2D 3D 4D
5D 6D AD
AC 9D KD
2S 3S 4S
KS 6S 7S
8S 9S 2H
JS QS KH
 5 8
2C 2D 2S 2H 3C 3D 3S 3H
4C 4D 4S 4H 5C 5D 5S 5H
8C 9C TC JC 7D 6H 9H J1
KC QC AC AS 7S JS TH QH
6C 7C J2 JH 6S 8H KH AH
 14 3
8H 9H TH
JH QH KH
2H 3H 4H
2C 3C 4C
5C 6C 7C
AC AD TC
2D 3D 4D
5D 6D 7D
8D AH AS
2S 3S 4S
5S 6S 7S
KC 9S KD
JC QC 8S
5H 6H 7H
 9 3
8D AH TD
5D 6D 7D
AS 3D 4D
8C AD TC
5C 6C KH
2C KS 4C
2H 3H 4H
5H 6H 7H
8H 9H TH
 14 3
8H 9H TH
5H 6H 7H
2H 3H 4H
2C 3C 4C
5C AH 7C
8C 9C AC
2D 3D 4D
5D AS 7D
AD KH TD
2S 3S 4S
5S 6S KC
8S KS TS
9S 7S JS
KD QS 6C
 6 3
7C 8C 9C
TC 2C 3C
QC 5C J1
2D 3D 4D
5D J2 6D
7D AD KS
 9 3
2H 4S AC
9S 2D 2S
AD TD 7S
J1 7D TS
3H QH 6H
JH 8S 5C
TC 6C 4H
9D 5D 9H
3S J2 QD
 6 6
3D 7C 8H 2S 5H 6D
QS KH TS 4D TH AH
4H J2 JC 6S QC JS
QH 9C AS 9H AC 4C
2H 3S KC J1 AD 9D
JD 8C 5S 3H JH 7H
 4 4
7S JD 5C 3S
9H 5H AS J2
KD JS 6D 9S
2S 8D JH J1
 6 3
J2 6D 2D
5D J1 7D
8D 9D TD
5H 6C 7C
8H TS QS
KS AS 2H
 6 7
2H 2D 3H 3D J2 2S 3S
4H 4D 5H 5D 4S 5S 6S
6H 6D TH TD 7S 8S 9S
JH JD QH QD AC KC QC
AH AD TS JS JC TC 9C
KH KD QS KS 8C 7C J1
 5 8
2C 2D 2S 2H 3C 3D 3S 3H
4C 4D 4S 4H 5C 5D 5S 5H
6H 9H J2 7D JC 8C 9C TC
JS TH QH 7S AS KC QC AC
8H KH AH 6S JH 6C 7C J1
 3 3
AH 5H J2
4H 8H KC
4C 9C TH
 5 8
2C 2D 2S 2H 3C 3D 3S 3H
4C 4D 4S 4H 5C 5D 5S 5H
6H 9H J1 7D JC 8C 9C TC
JS TH QH 7S AS KC QC AC
8H KH AH 6S JH 6C 7C J2
 4 13
8D 4S QH AS 3D 8C 6H AD 7D 9S 8S KH 7S
KS 2D 2C JH AC 8H 7H 3C J2 9C TS J1 QD
6D 3H QC 4D JD TH JC TD 4H 2H TC 5H KC
5S JS KD 5D AH 5C 4C 3S 6C 9D QS 6S 2S
 3 3
AH 9D 5D
JH 3S QH
J2 2S J1
 3 3
J1 7H 8H
AH QH 9H
J2 KH 2H
 6 7
J1 2H 3H 2D TS TD TC
4H 5H 6H JH JS JD JC
7H 8H 9H KH KS KD KC
7C 8C 9C AH AS AD TH
4C 5C 6C 3S 4S 5S 6S
J2 2C 3C QH QS QD QC
 5 8
2C 2D 2S 2H 3C 3D 3S 3H
4C 4D 4S 4H 5C 5D 5S 5H
8C 9C TC JC 7D 6H 9H J2
KC QC AC AS 7S JS TH QH
6C 7C J1 JH 6S 8H KH AH
 6 7
J1 2H 3H JH JS JC JD
4H 5H 6H 6D TH TS TD
7H 8H 9H 9D QS QC QD
7C 8C 9C KH KS KC KD
4C 5C 6C AH AS AC AD
2C 3C TC QH 6S 7S 8S
 7 7
J2 3C 4C 2D 3D 4D JC
5C 6C 7C 5D 6D 7D QC
8C 9C TC 8D 9D TD KC
2H 3H 4H 2S 3S 4S AC
5H 6H 7H 5S 6S 7S KH
8H 9H TH 8S 9S TS AH
JD QD KD AD JH QH J1
 7 7
4C 5S 6C 3H QD 8D 5C
7C 4D KC 2C 4S TH 2D
5H QS 9D 6S 2H 8H AC
J1 JC 3D TD J2 8C 7H
3C 5D 9S JD 8S 6D 9C
3S 7D AS KD KS KH AH
QH AD QC TC 2S JH TS
 5 5
2H 2S 2D 3D 4D
3H 3S 5D 6D 7D
2C 3C J2 8D 9D
4C 5C 6C 9H 9S
7C 8C 9C 8H 8S
 3 9
TH 2C AC 5H AH 5D 2D 3S TC
JD QC J1 2H 6C 9D 5S 2S 6S
8D KD J2 3D AS KC TS JC 5C
 13 4
AH TC J2 4D
QD 4S 3C KS
6S 8S 5S 9H
2D JS 7H JD
KD QS JC 6C
AD 3S 8C 7D
AS 2S 9C KC
3D J1 9D 8D
4H 7C TH 4C
9S QC QH 2C
2H 6H KH TD
3H 8H 5C TS
AC 5D 5H JH
 7 7
2C 3C 4C 2D 3D 4D JC
5C 6C 7C 5D 6D 7D QC
8C 9C TC 8D 9D TD KC
2H 3H J1 2S 3S 4S AC
5H 6H 7H 5S 6S 7S KH
8H 9H TH 8S 9S TS AH
JD QD KD AD JH QH AS
 7 7
3C 7S 2C AS 4S AC TS
KC 5H 4C 3S JC QS 9H
J1 JS 6H 3D KH 8D 2S
7H 2D 2H 3H 5S 5D 9C
6S TD KD 4H 7C QC 8C
9D TH 9S 5C QH AD 4D
8S JD 8H JH AH QD 6D
 6 7
2H 2D 3H 3D J1 2S 3S
4H 4D 5H 5D 4S 5S 6S
6H 6D TH TD 7S 8S 9S
JH JD QH QD AC KC QC
AH AD TS JS JC TC 9C
KH KD QS KS 8C 7C J2
 6 7
J2 2H 3H JH JS JC JD
4H 5H 6H 6D TH TS TD
7H 8H 9H 9D QS QC QD
7C 8C 9C KH KS KC KD
4C 5C 6C AH AS AC AD
2C 3C TC QH 6S 7S 8S

No solution.
 Solution exists.
Replace J1 with 2S and J2 with 9D.
Put the first square to (1, 1).
Put the second square to (1, 4).
 Solution exists.
Replace J1 with 5D and J2 with TH.
Put the first square to (1, 9).
Put the second square to (1, 12).
 No solution.
 Solution exists.
There are no jokers.
Put the first square to (1, 5).
Put the second square to (5, 1).
 No solution.
 Solution exists.
Replace J2 with 2C.
Put the first square to (1, 1).
Put the second square to (5, 1).
 No solution.
 No solution.
 No solution.
 No solution.
 No solution.
 No solution.
 Solution exists.
Replace J2 with 7C.
Put the first square to (1, 1).
Put the second square to (1, 4).
 Solution exists.
There are no jokers.
Put the first square to (1, 1).
Put the second square to (1, 4).
 No solution.
 Solution exists.
Replace J1 with 7H and J2 with JD.
Put the first square to (3, 1).
Put the second square to (3, 6).
 No solution.
 No solution.
 No solution.
 Solution exists.
Replace J1 with 4C and J2 with 8D.
Put the first square to (1, 1).
Put the second square to (4, 1).
 No solution.
 Solution exists.
Replace J1 with 2C and J2 with 2D.
Put the first square to (1, 1).
Put the second square to (4, 1).
 No solution.
 Solution exists.
Replace J1 with 3C and J2 with 4C.
Put the first square to (1, 1).
Put the second square to (4, 1).
 Solution exists.
Replace J1 with 2C and J2 with AS.
Put the first square to (1, 5).
Put the second square to (4, 5).
 Solution exists.
Replace J1 with JD and J2 with 7H.
Put the first square to (3, 1).
Put the second square to (3, 6).
 No solution.
 Solution exists.
Replace J1 with 7H and J2 with JD.
Put the first square to (3, 1).
Put the second square to (3, 6).
 No solution.
 No solution.
 No solution.
 No solution.
 Solution exists.
Replace J1 with JD and J2 with 7H.
Put the first square to (3, 1).
Put the second square to (3, 6).
 No solution.
 Solution exists.
Replace J1 with 2C and J2 with JS.
Put the first square to (1, 1).
Put the second square to (1, 4).
 No solution.
 No solution.
 No solution.
 Solution exists.
Replace J1 with 6D and J2 with 7S.
Put the first square to (1, 1).
Put the second square to (5, 2).
 Solution exists.
Replace J1 with 4H.
Put the first square to (1, 1).
Put the second square to (1, 4).
 Solution exists.
Replace J1 with 6C.
Put the first square to (1, 5).
Put the second square to (5, 3).
 Solution exists.
Replace J1 with AS and J2 with 2C.
Put the first square to (1, 5).
Put the second square to (4, 5).
 No solution.

#include <bits/stdc++.h>
using namespace std;
char cards[] = {'2', '3', '4', '5', '6', '7', '8',
                '9', 'T', 'J', 'Q', 'K', 'A'};
char color[] = {'C', 'D', 'H', 'S'};
string g[20][20];
map<string, bool> cardsMap;
set<string> avail;
vector<tuple<int, int, vector<string>, int, bool, bool, bool, bool>> p;
int amountofJ;
bool firstJ, secondJ;
void output(const pair<int, int> &a, const pair<int, int> &b, string s1,
            string s2) {
  cout << "Solution exists." << endl;
  if (s1 != "" && s2 != "") {
    cout << "Replace J1 with " << s1 << " and J2 with " << s2 << "." << endl;
  } else if (s1 != "" && s2 == "") {
    cout << "Replace J1 with " << s1 << "." << endl;
  } else if (s2 != "" && s1 == "") {
    cout << "Replace J2 with " << s2 << "." << endl;
  } else if (s1 == "" && s2 == "") {
    cout << "There are no jokers." << endl;
  }
  cout << "Put the first square to (" << a.first + 1 << ", " << a.second + 1
       << ")." << endl;
  cout << "Put the second square to (" << b.first + 1 << ", " << b.second + 1
       << ")." << endl;
}
bool f(tuple<int, int, vector<string>, int, bool, bool, bool, bool> &a,
       const tuple<int, int, vector<string>, int, bool, bool, bool, bool> &b) {
  int j;
  j = get<3>(a);
  vector<string> answer;
  if (get<4>(a)) {
    for (auto &qwe : avail) {
      if (qwe[1] == (*get<2>(a).begin()).at(1)) {
        answer.push_back(qwe);
        get<2>(a).push_back(qwe);
      }
    }
  }
  if (answer.size() < get<3>(a) && get<5>(a)) {
    answer.clear();
    for (auto &qwe : avail) {
      bool flag = 0;
      for (auto card : get<2>(a)) {
        if (card[0] == qwe[0]) {
          flag = 1;
          break;
        }
      }
      if (!flag) {
        answer.push_back(qwe);
        get<2>(a).push_back(qwe);
      }
    }
  }
  if (answer.size() >= get<3>(a)) {
    if (answer.size() == 1 && amountofJ == 2) {
      for (auto qwe : avail) {
        if (qwe != answer[0]) {
          answer.push_back(qwe);
          break;
        }
      }
      if (answer.size() == 1) {
        return 0;
      }
    }
    answer.push_back("");
    answer.push_back("");
    if (secondJ && !firstJ) {
      output(make_pair(get<0>(a), get<1>(a)), make_pair(get<0>(b), get<1>(b)),
             string(""), answer[0]);
    } else if (firstJ && !secondJ) {
      output(make_pair(get<0>(a), get<1>(a)), make_pair(get<0>(b), get<1>(b)),
             answer[0], string(""));
    } else {
      output(make_pair(get<0>(a), get<1>(a)), make_pair(get<0>(b), get<1>(b)),
             answer[0], answer[1]);
    }
    return 1;
  }
  return 0;
}
bool insert(tuple<int, int, vector<string>, int, bool, bool, bool, bool> &a,
            tuple<int, int, vector<string>, int, bool, bool, bool, bool> &b) {
  if (!get<3>(a) && !get<3>(b)) {
    output(make_pair(get<0>(a), get<1>(a)), make_pair(get<0>(b), get<1>(b)), "",
           "");
    return 1;
  }
  if (get<3>(a) && get<3>(b)) {
    if (get<4>(a)) {
      if (get<4>(b)) {
        for (auto qwe : avail) {
          if (qwe[1] == (*get<2>(a).begin()).at(1)) {
            for (auto ewq : avail) {
              if (ewq == qwe) continue;
              if (ewq[1] == (*get<2>(b).begin()).at(1)) {
                string s1, s2;
                if (get<6>(a)) {
                  s1 = qwe;
                  s2 = ewq;
                } else {
                  s1 = ewq;
                  s2 = qwe;
                }
                output(make_pair(get<0>(a), get<1>(a)),
                       make_pair(get<0>(b), get<1>(b)), s1, s2);
                return 1;
              }
            }
          }
        }
      }
      if (get<5>(b)) {
        for (auto qwe : avail) {
          if (qwe[1] == (*get<2>(a).begin()).at(1)) {
            for (auto ewq : avail) {
              bool flag = 0;
              if (ewq == qwe) continue;
              for (auto card : get<2>(b)) {
                if (ewq[0] == card[0]) {
                  flag = 1;
                  break;
                }
              }
              if (!flag) {
                string s1, s2;
                if (get<6>(a)) {
                  s1 = qwe;
                  s2 = ewq;
                } else {
                  s1 = ewq;
                  s2 = qwe;
                }
                output(make_pair(get<0>(a), get<1>(a)),
                       make_pair(get<0>(b), get<1>(b)), s1, s2);
                return 1;
              }
            }
          }
        }
      }
    }
    if (get<5>(a)) {
      if (get<4>(b)) {
        for (auto qwe : avail) {
          bool flag = 0;
          for (auto card1 : get<2>(a)) {
            if (qwe[0] == card1[0]) {
              flag = 1;
              break;
            }
          }
          if (!flag) {
            for (auto ewq : avail) {
              if (qwe == ewq) continue;
              if (ewq[1] == (*get<2>(b).begin()).at(1)) {
                string s1, s2;
                if (get<6>(a)) {
                  s1 = qwe;
                  s2 = ewq;
                } else {
                  s1 = ewq;
                  s2 = qwe;
                }
                output(make_pair(get<0>(a), get<1>(a)),
                       make_pair(get<0>(b), get<1>(b)), s1, s2);
                return 1;
              }
            }
          }
        }
      }
      if (get<5>(b)) {
        for (auto qwe : avail) {
          bool flag = 0;
          for (auto card1 : get<2>(a)) {
            if (qwe[0] == card1[0]) {
              flag = 1;
              break;
            }
          }
          if (!flag) {
            for (auto ewq : avail) {
              if (qwe == ewq) continue;
              bool flag1 = 0;
              for (auto card2 : get<2>(a)) {
                if (ewq[0] == card2[0]) {
                  flag = 1;
                  break;
                }
              }
              if (!flag) {
                string s1, s2;
                if (get<6>(a)) {
                  s1 = qwe;
                  s2 = ewq;
                } else {
                  s1 = ewq;
                  s2 = qwe;
                }
                output(make_pair(get<0>(a), get<1>(a)),
                       make_pair(get<0>(b), get<1>(b)), s1, s2);
                return 1;
              }
            }
          }
        }
      }
    }
  } else {
    if (get<3>(a)) {
      return f(a, b);
    } else {
      return f(b, a);
    }
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  for (auto i : cards) {
    for (auto j : color) {
      string t;
      t.push_back(i);
      t.push_back(j);
      avail.insert(t);
    }
  }
  if (n < 6 && m < 6) {
    cout << "No solution.";
    return 0;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> g[i][j];
      avail.erase(g[i][j]);
    }
  }
  for (int i = 0; i < n - 2; i++) {
    for (int j = 0; j < m - 2; j++) {
      set<char> sqCards;
      set<char> sqColors;
      vector<string> tmp;
      int joker = 0;
      bool first = false, second = false;
      for (int k = 0; k < 3; k++) {
        for (int z = 0; z < 3; z++) {
          if (g[i + k][j + z][1] == '1' || g[i + k][j + z][1] == '2') {
            joker++;
            if (g[i + k][j + z][1] == '1')
              firstJ = 1;
            else
              secondJ = 1;
            first |= g[i + k][j + z][1] == '1';
            second |= g[i + k][j + z][1] == '2';
          } else {
            sqCards.insert(g[i + k][j + z][0]);
            sqColors.insert(g[i + k][j + z][1]);
            tmp.push_back(g[i + k][j + z]);
          }
        }
      }
      if (sqColors.size() == 1 || sqCards.size() + joker == 9) {
        p.emplace_back(i, j, tmp, joker, sqColors.size() == 1,
                       sqCards.size() + joker == 9, first, second);
      }
    }
  }
  amountofJ = firstJ + secondJ;
  if (p.size() < 2) {
    cout << "No solution.";
    return 0;
  }
  for (int i = 0; i < p.size(); i++) {
    for (int j = 0; j < p.size(); j++) {
      if (i != j &&
          (abs(get<0>(p[i]) - get<0>(p[j])) >= 3 ||
           abs(get<1>(p[i]) - get<1>(p[j])) >= 3) &&
          insert(p[i], p[j])) {
        return 0;
      }
    }
  }
  cout << "No solution.";
  return 0;
}
