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.

import java.awt.Point;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;


public class ProblemD {

    public static void main(String[] args) {
        ProblemD problem = new ProblemD();
        problem.solve();
    }

    private String[][] map;
    private Set<String> onmap;

    private char[] dig = new char[] { '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' };
    private char[] mst = new char[] { 'C', 'D', 'H', 'S' };
    private int n;
    private int m;
    
    private void solve() {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        map = new String[n][m];
        onmap = new HashSet<String>();
        Point j1 = null, j2 = null;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                map[i][j] = sc.next();
                onmap.add(map[i][j]);
                if (map[i][j].startsWith("J")) {
                    if (j1 == null) {
                        j1 = new Point(i, j);
                    } else {
                        j2 = new Point(i, j);
                    }
                }
            }
        }
        if (ok(map, null, null, null, null)) {
        } else {
            if (j1 == null) {
                System.out.println("No solution.");
                return;
            }
            boolean hassol = false;
            Set<String> unused = new HashSet<String>();
            for (int i = 0; i < dig.length; i++) {
                for (int j = 0; j < mst.length; j++) {
                    String name = dig[i] + "" + mst[j];
                    if (!name.startsWith("J") && !onmap.contains(name)) {
                        unused.add(name);
                    }
                }
            }
            int N = unused.size();
            if (j2 == null) {
                for (String replace : unused) {
                    String was = map[j1.x][j1.y];
                    map[j1.x][j1.y] = replace;
                    if (ok(map, replace, null, was, null)) {
                        return;
                    }
                    map[j1.x][j1.y] = was;
                }
            } else {
                for (String replace1 : unused) {
                    for (String replace2: unused) {
                        if (!replace1.equals(replace2)) {
                            String was1 = map[j1.x][j1.y];
                            String was2 = map[j2.x][j2.y];
                            map[j1.x][j1.y] = replace1;
                            map[j2.x][j2.y] = replace2;
                            if (ok(map, replace1, replace2, was1, was2)) {
                                return;
                            }
                            map[j1.x][j1.y] = was1;
                            map[j2.x][j2.y] = was2;
                        }
                    }
                }
            }
            System.out.println("No solution.");
        }
    }

    private boolean ok(String[][] a, String replace1, String replace2, String j1name, String j2name) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (a[i][j].startsWith("J")) {
                    return false;
                }
            }
        }
        for (int i1 = 0; i1 < n - 2; i1++) {
            for (int j1 = 0; j1 < m - 2; j1++) {
                if (oksq(i1, j1, a)) {
                    for (int i2 = i1; i2 < n - 2; i2++) {
                        for (int j2 = j1; j2 < m - 2; j2++) {
                            if (okidx(i1, j1, i2, j2)) {
                                if (oksq(i2, j2, a)) {
                                    System.out.println("Solution exists.");
                                    if (replace1 == null && replace2 == null) {
                                        System.out.println("There are no jokers.");
                                    } else {
                                        if (replace2 == null) {
                                            System.out.println("Replace " + j1name + " with " + replace1);
                                        } else {
                                            System.out.println("Replace " + j1name + " with " + replace1);
                                            System.out.println("Replace " + j2name + " with " + replace2);
                                        }
                                    }
                                    System.out.println("Put the first square to (" + (i1 + 1) + ", " + (j1 + 1) + ").");
                                    System.out.println("Put the second square to (" + (i2 + 1) + ", " + (j2 + 1) + ").");
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    private boolean okidx(int i1, int j1, int i2, int j2) {
        boolean[][] was = new boolean[n][m];
        for (int i = i1; i < i1 + 3; i++) {
            for (int j = j1; j < j1 + 3; j++) {
                was[i][j] = true;
            }
        }
        for (int i = i2; i < i2 + 3; i++) {
            for (int j = j2; j < j2 + 3; j++) {
                if (was[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }

    private boolean oksq(int si, int sj, String[][] a) {
        Set<String> difm = new HashSet<String>();
        Set<String> dost = new HashSet<String>();
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                difm.add("" +a[si + i][sj + j].charAt(1));
                dost.add("" + a[si + i][sj + j].charAt(0));
            }
        }
        if (difm.size() == 1) {
            return true;
        }
        if (dost.size() == 9) {
            return true;
        }
        return false;
    }

}
