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.

//package codeforces.br65;

import java.io.*;
import java.math.*;
import java.util.*;

public class ProblemC {

    String[][] a;
    int n,m;
    boolean globalfind;
    int[] pos1, pos2;

    private boolean check(int r, int c) {
        if (r < 0)
            return false;
        if (c < 0)
            return false;
        if (r > n - 3)
            return false;
        if (c > m - 3)
            return false;
        boolean onemast = true;
        boolean first = true;
        Character mast = '0';
        Set<Character> dost = new HashSet<Character>();
        boolean diffdost = true;
        for(int i=r;i<r+3;i++)
            for(int j=c;j<c+3;j++)
                if (!a[i][j].equals("J1") && !a[i][j].equals("J2")) {
                    Character ch = a[i][j].charAt(0);
                    if (dost.contains(ch))
                        diffdost = false;
                    else {
                        dost.add(ch);
                    }
                    if (first) {
                        mast = a[i][j].charAt(1);
                        first = false;
                    } else {
                        if (a[i][j].charAt(1) != mast)
                            onemast = false;
                    }
                } else {
                    onemast = false;
                    diffdost = false;
                }
        return onemast || diffdost;
    }

    public void solve() {
        boolean oj = true;

        try {
            Reader reader = oj ? new InputStreamReader(System.in) : new FileReader("C.in");
            Writer writer = oj ? new OutputStreamWriter(System.out) : new FileWriter("C.out");
            BufferedReader br = new BufferedReader(reader);
            StreamTokenizer st = new StreamTokenizer(reader);
            PrintWriter out = new PrintWriter(writer);

            MyTokenizer tok = new MyTokenizer(br.readLine());

            n = tok.getInteger();
            m = tok.getInteger();

            a = new String[n][m];

            for(int i=0;i<n;i++) {
                tok = new MyTokenizer(br.readLine());
                for(int j=0;j<m;j++) {
                    a[i][j] = tok.getString();
                }
            }

            char[] dost = new char[] {'2', '3','4','5','6','7','8','9','T','J','Q','K','A'};
            char[] mast = new char[] {'C', 'D','H','S'};
            List<String> miss = new ArrayList<String>();
            for(int i=0;i<dost.length;i++) {
                for(int j=0;j<mast.length;j++) {
                    String card = dost[i] + "" + mast[j];
                    boolean exists = false;
                    for(int k=0;k<n;k++)
                        for(int l=0;l<m;l++) {
                            if (card.equals(a[k][l])) {
                                exists = true;
                                break;
                            }
                        }
                    if (!exists)
                        miss.add(card);
                }
            }

            List<int[]> jokers = new ArrayList<int[]>();
            List<String> js = new ArrayList<String>();
            List<String> replace = new ArrayList<String>();

            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++) {
                    if (a[i][j].equals("J1")) {
                        jokers.add(new int[] {i, j});
                        js.add(a[i][j]);
                        replace.add("");
                    }
                    if (a[i][j].equals("J2")) {
                        jokers.add(new int[] {i, j});
                        js.add(a[i][j]);
                        replace.add("");
                    }
                }

            globalfind = false;
            pos1 = new int[2];
            pos2 = new int[2];

            List<int[]> valids = new ArrayList<int[]>();
            boolean[][] bb = new boolean[n][m];
            for(int i=0;i<n-2;i++)
                for(int j=0;j<m-2;j++) {
                    if (check(i, j)) {
                        valids.add(new int[]{i, j});
                        bb[i][j] = true;
                    }
                }
            if (jokers.size() == 0) {
                for(int k=0;k<valids.size();k++)
                    for(int l=0;l<valids.size();l++)
                        if (k != l) {
                            int px1 = valids.get(k)[0];
                            int py1 = valids.get(k)[1];
                            int px2 = valids.get(l)[0];
                            int py2 = valids.get(l)[1];
                            if (Math.max(px1, px2) > Math.min(px1 + 2, px2 + 2) ||
                                Math.max(py1, py2) > Math.min(py1 + 2, py2 + 2)) {
                                if (!globalfind) {
                                    globalfind = true;
                                    pos1[0] = px1;
                                    pos1[1] = py1;
                                    pos2[0] = px2;
                                    pos2[1] = py2;
                                }
                            }
                        }
            } else if (jokers.size() == 1) {
                for(int i=0;i<miss.size();i++) {
                    int x1 = jokers.get(0)[0];
                    int y1 = jokers.get(0)[1];
                    String s1 = a[x1][y1];
                    a[x1][y1] = miss.get(i);

                    List<int[]> newvalids = new ArrayList<int[]>();
                    for(int k=0;k<valids.size();k++)
                        newvalids.add(valids.get(k));
                    boolean[][] b = new boolean[n][m];
                    for(int k=x1-2;k<=x1+2;k++)
                        for(int l=y1-2;l<=y1+2;l++) {
                            if (k >= 0 && k < n-2 && l >= 0 && l < m - 2 &&
                                !b[k][l] && !bb[k][l] && check(k, l)) {
                                newvalids.add(new int[]{k, l});
                                b[k][l] = true;
                            }
                        }

                    for(int k=0;k<newvalids.size();k++)
                        for(int l=0;l<newvalids.size();l++)
                            if (k != l) {
                                int px1 = newvalids.get(k)[0];
                                int py1 = newvalids.get(k)[1];
                                int px2 = newvalids.get(l)[0];
                                int py2 = newvalids.get(l)[1];
                                if (Math.max(px1, px2) > Math.min(px1 + 2, px2 + 2) ||
                                    Math.max(py1, py2) > Math.min(py1 + 2, py2 + 2)) {
                                    if (!globalfind) {
                                        globalfind = true;
                                        pos1[0] = px1;
                                        pos1[1] = py1;
                                        pos2[0] = px2;
                                        pos2[1] = py2;
                                        replace.set(0, miss.get(i));
                                    }
                                }
                            }

                    a[x1][y1] = s1;
                }
            } else if (jokers.size() == 2) {
                for(int i=0;i<miss.size();i++) {
                    for(int j=0;j<miss.size();j++) {
                        if (i != j) {
                            int x1 = jokers.get(0)[0];
                            int y1 = jokers.get(0)[1];
                            int x2 = jokers.get(1)[0];
                            int y2 = jokers.get(1)[1];
                            String s1 = a[x1][y1];
                            a[x1][y1] = miss.get(i);
                            String s2 = a[x2][y2];
                            a[x2][y2] = miss.get(j);

                            List<int[]> newvalids = new ArrayList<int[]>();
                            for(int k=0;k<valids.size();k++)
                                newvalids.add(valids.get(k));
                            boolean[][] b = new boolean[n][m];
                            for(int k=x1-2;k<=x1+2;k++)
                                for(int l=y1-2;l<=y1+2;l++) {
                                    if (k >= 0 && k < n-2 && l >= 0 && l < m - 2 &&
                                        !b[k][l] && !bb[k][l] && check(k, l)) {
                                        newvalids.add(new int[]{k, l});
                                        b[k][l] = true;
                                    }
                                }
                            for(int k=x2-2;k<=x2+2;k++)
                                for(int l=y2-2;l<=y2+2;l++) {
                                    if (k >= 0 && k < n-2 && l >= 0 && l < m - 2 &&
                                        !b[k][l] && !bb[k][l] && check(k, l)) {
                                        newvalids.add(new int[]{k, l});
                                        b[k][l] = true;
                                    }
                                }
                            for(int k=0;k<newvalids.size();k++)
                                for(int l=0;l<newvalids.size();l++)
                                    if (k != l) {
                                        int px1 = newvalids.get(k)[0];
                                        int py1 = newvalids.get(k)[1];
                                        int px2 = newvalids.get(l)[0];
                                        int py2 = newvalids.get(l)[1];
                                        if (Math.max(px1, px2) > Math.min(px1 + 2, px2 + 2) ||
                                            Math.max(py1, py2) > Math.min(py1 + 2, py2 + 2)) {
                                            if (!globalfind) {
                                                globalfind = true;
                                                pos1[0] = px1;
                                                pos1[1] = py1;
                                                pos2[0] = px2;
                                                pos2[1] = py2;
                                                replace.set(0, miss.get(i));
                                                replace.set(1, miss.get(j));
                                            }
                                        }
                                    }

                            a[x1][y1] = s1;
                            a[x2][y2] = s2;
                        }
                    }
                }
            }

            if (!globalfind) {
                out.printf("No solution.");
            } else {
                out.printf("Solution exists.\n");
                if (jokers.size() == 0)
                    out.printf("There are no jokers.\n");
                else if (jokers.size() == 1) {
                    out.printf("Replace %s with %s.\n", js.get(0), replace.get(0));
                } else {
                    if (js.get(0).equals("J2")) {
                        out.printf("Replace J1 with %s and J2 with %s.\n", replace.get(1), replace.get(0));
                    } else {
                        out.printf("Replace J1 with %s and J2 with %s.\n", replace.get(0), replace.get(1));
                    }
                }
                out.printf("Put the first square to (%d, %d).\n", pos1[0] + 1, pos1[1] + 1);
                out.printf("Put the second square to (%d, %d).\n", pos2[0] + 1, pos2[1] + 1);
            }

            br.close();
            out.close();
            reader.close();
            writer.close();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        finally {
        }
    }


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

    private class MyTokenizer {
        private String s;
        private int cur;

        public MyTokenizer(String s) {
            this.s = s;
            cur = 0;
        }

        public void skip() {
            while (cur < s.length() && (s.charAt(cur) == ' ' || s.charAt(cur) == '\t' || s.charAt(cur) == '\n')) {
                cur++;
            }
        }

        public double getDouble() {
            skip();
            String snum = "";
            while (cur < s.length() && (s.charAt(cur) >= '0' && s.charAt(cur) <= '9' || s.charAt(cur) == '.' || s.charAt(cur) == '-')) {
                snum += s.charAt(cur);
                cur++;
            }
            if (snum.startsWith("."))
                snum = "0" + snum;
            return Double.valueOf(snum);
        }

        public int getInteger() {
            skip();
            String snum = "";
            while (cur < s.length() && (s.charAt(cur) >= '0' && s.charAt(cur) <= '9' || s.charAt(cur) == '.' || s.charAt(cur) == '-')) {
                snum += s.charAt(cur);
                cur++;
            }
            return Integer.valueOf(snum);
        }

        public String getString() {
            skip();
            String s2 = "";
            while (cur < s.length() && (((s.charAt(cur) >= 'a' && s.charAt(cur) <= 'z')) ||
                    ((s.charAt(cur) >= 'A' && s.charAt(cur) <= 'Z')) ||
                    ((s.charAt(cur) >= '0' && s.charAt(cur) <= '9')) ||
                    s.charAt(cur) == '_'
            )) {
                s2 += s.charAt(cur);
                cur++;
            }
            return s2;
        }

        public char getCurrentChar() throws Exception {
            if (cur < s.length())
                return s.charAt(cur);
            else
                throw new Exception("Current character out of string length");
        }

        public void moveNextChar() {
            if (cur < s.length())
                cur++;
        }

        public boolean isFinished() {
            return cur >= s.length();
        }
    }
}
