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;
const int inf = (1 << 30) - 1;
const long double eps = 1e-9;
const long double pi = fabs(atan2(0.0, -1.0));
int *ass;
void ML() {
  for (;;) {
    ass = new int[2500000];
    for (int i = 0; i < 2500000; i++) ass[i] = rand();
  }
}
struct node {
  char v;
  char m;
  bool isj() { return 'J' == v && ('1' == m || '2' == m); }
  node(const char _v, const char _m) {
    m = _m;
    v = _v;
  }
  node() {}
};
bool operator<(const node &a, const node &b) {
  if (a.v != b.v) return a.v < b.v;
  return a.m < b.m;
}
bool doswj;
int n, m;
vector<vector<node> > a;
vector<vector<bool> > was;
set<node> used;
void printmap() {
  for (int i = 0; i < n; i++) {
    puts("");
    for (int j = 0; j < m; j++) {
      cout << a[i][j].v << a[i][j].m << " ";
    }
  }
}
bool j1e = false;
bool j2e = false;
void LoAd() {
  scanf("%d%d\n", &n, &m);
  a.resize(n, vector<node>(m));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      scanf("%c%c ", &a[i][j].v, &a[i][j].m);
      used.insert(a[i][j]);
      if (a[i][j].isj())
        if (a[i][j].m == '1')
          j1e = true;
        else
          j2e = true;
    }
  }
}
set<node> jo1;
set<node> jo2;
char vals[] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
const int vals_count = 13;
char cols[] = {'C', 'D', 'H', 'S'};
const int cols_count = 4;
int i1, i2, nomj1, j2;
bool checkBounds(const int i0, const int j0) {
  for (int i = i0; i < i0 + 3; i++) {
    if (i >= n) return false;
    for (int j = j0; j < j0 + 3; j++) {
      if (j >= m) return false;
      if (was[i][j]) return false;
    }
  }
  return true;
}
bool isFlush(const int i0, const int j0) {
  set<node> jo1o = jo1;
  set<node> jo2o = jo2;
  char clr;
  for (int i = i0; i < i0 + 3; i++) {
    for (int j = j0; j < j0 + 3; j++) {
      if (!a[i][j].isj()) clr = a[i][j].m;
    }
  }
  for (int i = i0; i < i0 + 3; i++) {
    for (int j = j0; j < j0 + 3; j++) {
      if (a[i][j].isj()) {
        if (jo1.empty()) {
          if (a[i][j].m == '2')
            doswj = true;
          else
            doswj = false;
          for (int i = 0; i < vals_count; i++) {
            if (used.find(node(vals[i], clr)) == used.end())
              jo1.insert(node(vals[i], clr));
          }
        } else {
          for (int i = 0; i < vals_count; i++) {
            if (used.find(node(vals[i], clr)) == used.end())
              jo2.insert(node(vals[i], clr));
          }
        }
      } else if (a[i][j].m != clr) {
        jo1 = jo1o;
        jo2 = jo2o;
        return false;
      }
    }
  }
  return true;
}
bool isKsh(const int i0, const int j0) {
  set<node> jo1o = jo1;
  set<node> jo2o = jo2;
  set<char> used_vals;
  int j_nums = 0;
  for (int i = i0; i < i0 + 3; i++) {
    for (int j = j0; j < j0 + 3; j++) {
      if (a[i][j].isj())
        j_nums++;
      else
        used_vals.insert(a[i][j].v);
    }
  }
  if (j_nums + used_vals.size() != 9) return false;
  for (int i = i0; i < i0 + 3; i++) {
    for (int j = j0; j < j0 + 3; j++) {
      if (a[i][j].isj()) {
        if (jo1.empty()) {
          if (a[i][j].m == '2')
            doswj = true;
          else
            doswj = false;
          for (int i = 0; i < vals_count; i++) {
            for (int j = 0; j < cols_count; j++) {
              if (used_vals.find(vals[i]) == used_vals.end())
                if (used.find(node(vals[i], cols[j])) == used.end())
                  jo1.insert(node(vals[i], cols[j]));
            }
          }
        } else {
          for (int i = 0; i < vals_count; i++) {
            for (int j = 0; j < cols_count; j++) {
              if (used_vals.find(vals[i]) == used_vals.end())
                if (used.find(node(vals[i], cols[j])) == used.end())
                  jo2.insert(node(vals[i], cols[j]));
            }
          }
        }
      }
    }
  }
  return true;
}
void findresult() {
  if (doswj) swap(jo1, jo2);
  if (!j1e && !j2e) {
    puts("Solution exists.");
    puts("There are no jokers.");
    printf("Put the first square to (%d, %d).\n", i1 + 1, nomj1 + 1);
    printf("Put the second square to (%d, %d).", i2 + 1, j2 + 1);
    exit(0);
  }
  if (j1e && !j2e) {
    node res1 = *jo1.begin();
    puts("Solution exists.");
    printf("Replace J1 with %c%c.\n", res1.v, res1.m);
    printf("Put the first square to (%d, %d).\n", i1 + 1, nomj1 + 1);
    printf("Put the second square to (%d, %d).", i2 + 1, j2 + 1);
    exit(0);
  }
  if (!j1e && j2e) {
    node res1 = *jo2.begin();
    puts("Solution exists.");
    printf("Replace J2 with %c%c.\n", res1.v, res1.m);
    printf("Put the first square to (%d, %d).\n", i1 + 1, nomj1 + 1);
    printf("Put the second square to (%d, %d).", i2 + 1, j2 + 1);
    exit(0);
  }
  if (j1e && j2e) {
    for (set<node>::iterator res1 = jo1.begin(); res1 != jo1.end(); res1++) {
      for (set<node>::iterator res2 = jo2.begin(); res2 != jo2.end(); res2++) {
        {
          puts("Solution exists.");
          printf("Replace J1 with %c%c and J2 with %c%c\n", res1->v, res1->m,
                 res2->v, res2->m);
          printf("Put the first square to (%d, %d).\n", i1 + 1, nomj1 + 1);
          printf("Put the second square to (%d, %d).", i2 + 1, j2 + 1);
          exit(0);
        }
      }
    }
  }
  puts("No solution.");
  exit(0);
}
bool checkSquare2(const int i0, const int j0) {
  i2 = i0;
  j2 = j0;
  if (!(checkBounds(i0, j0))) return false;
  set<node> jo1o = jo1;
  set<node> jo2o = jo2;
  if (isFlush(i0, j0)) findresult();
  jo1 = jo1o;
  jo2 = jo2o;
  if (isKsh(i0, j0)) findresult();
  jo1 = jo1o;
  jo2 = jo2o;
  return false;
}
void findS2(const int i0, const int j0) {
  for (int i = i0; i < i0 + 3; i++)
    for (int j = j0; j < j0 + 3; j++) was[i][j] = true;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (checkSquare2(i, j)) {
      }
    }
  }
}
bool checkSquare1(const int i0, const int j0) {
  i1 = i0;
  nomj1 = j0;
  if (!(checkBounds(i0, j0))) return false;
  if (isFlush(i0, j0)) findS2(i0, j0);
  was.assign(n, vector<bool>(m, false));
  jo1.clear();
  jo2.clear();
  if (isKsh(i0, j0)) findS2(i0, j0);
  was.assign(n, vector<bool>(m, false));
  jo1.clear();
  jo2.clear();
  return false;
}
void SoLvE() {
  doswj = false;
  was.resize(n, vector<bool>(m, false));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (checkSquare1(i, j)) {
      }
    }
  }
  puts("No solution.");
  exit(0);
}
int main() {
  srand((int)time(NULL));
  LoAd();
  SoLvE();
  return 0;
}
