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.

/**
 * Created by IntelliJ IDEA.
 * User: aircube
 * Date: 31.03.11
 * Time: 23:46
 * To change this template use File | Settings | File Templates.
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.Vector;

public class taskD {


    class Card {
        int value ;
        int suite ;

        Card(String input) {
            this.value = getValue(input);
            this.suite = getSuite(input);
        }

        Card(int value, int suite) {
            this.value = value;
            this.suite = suite;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Card card = (Card) o;

            if (suite != card.suite) return false;
            if (value != card.value) return false;

            return true;
        }

        @Override
        public int hashCode() {
            int result = value;
            result = 31 * result + suite;
            return result;
        }

        @Override
        public String toString() {
            return "Card{" +
                    "value=" + value +
                    ", suite=" + suite +
                    '}';
        }
    }
    int getValue(String input) {
        char ch = input.charAt(0);
        char ch0 = input.charAt(1);
        if (ch >= '2' && ch <= '9') return ch - '0';
        //«T», «J», «Q», «K» и «A»
        if (ch == 'T') return 10;
        if (ch == 'J' && (ch0 == 'C' || ch0 == 'D' || ch0 == 'H' || ch0 == 'S')) return 11;
        if (ch == 'Q') return 12;
        if (ch == 'K') return 13;
        if (ch == 'A') return 14;
        return 15;
    }
    int getSuite(String input) {
        char ch = input.charAt(0);
        char ch0 = input.charAt(1);
        //(ch0 == 'C' || ch0 == 'D' || ch0 == 'H' || ch0 == 'S')) return 11;
        if (ch0 == 'C') return 0;
        if (ch0 == 'D') return 1;
        if (ch0 == 'H') return 2;
        if (ch0 == 'S') return 3;
        if (ch0 == '1') return 4;
        if (ch0 == '2') return 5;
        throw new RuntimeException();
    }
    String cardToString(Card card) {
        String ans = "";
        if (card.value >= 2 && card.value <= 9) {
            ans += Integer.toString(card.value);
        } else if (card.value == 10) {
            ans += "T";
        } else if (card.value == 11) {
            ans += "J";
        } else if (card.value == 12) {
            ans += "Q";
        } else if (card.value == 13) {
            ans += "K";
        } else if (card.value == 14) {
            ans += "A";
        } else {
            throw new RuntimeException();
        }
        ans += toSuite(card.suite);
        return ans ;
    }

    private String toSuite(int suite) {
        char s[] = new char[] {'C', 'D', 'H', 'S'};
        return Character.toString(s[suite]);
    }

    void solve() throws IOException {
        int n = nextInt();
        int m = nextInt();
        Card table[][] = new Card[n][m];
        Set<Card> set = new HashSet<Card> ();

        Vector<Integer> x = new Vector<Integer> () ;
        Vector<Integer> y = new Vector<Integer>() ;
        Vector<Integer> num = new Vector<Integer> () ;
        for (int i = 0; i < n; ++i) {
            for (int j =0 ; j < m; ++j) {
                table[i][j] = new Card(nextToken());
                set.add(table[i][j]);
                if (table[i][j].value == 15) {
                    x.add(j);
                    y.add(i);
                    num.add(table[i][j].suite == 4 ? 1 : 2);
                }
            }
        }

        if (x.size() == 0) {
            int a[] = new int[4];
            if (goodTable(table, a)) {
                out.println("Solution exists.");
                out.println("There are no jokers.");
                out.println("Put the first square to (" + (a[1] + 1) + ", " + (a[0] + 1) + ").");
                out.println("Put the second square to ("+(a[3]+1)+", "+(a[2]+1)+").");
            } else {
                out.println("No solution.");
            }
        } else {
            if (x.size() == 1) {
                int a[] = new int[4];
                for (int val = 2; val <= 14; ++val) {
                    for (int suite = 0; suite <= 3; ++suite) {
                        if (!set.contains(new Card(val, suite))) {
                            table[y.get(0)][x.get(0)] = new Card(val, suite);
                            if (goodTable(table, a)) {
                                out.println("Solution exists.");
                                out.println("Replace J" + (num.get(0)) + " with " + cardToString(new Card(val, suite)) + ".");
                                out.println("Put the first square to (" + (a[1] + 1) + ", " + (a[0] + 1) + ").");
                                out.println("Put the second square to ("+(a[3]+1)+", "+(a[2]+1)+").");
                                return;
                            }
                        }
                    }
                }
                out.print("No solution.");
            } else {
                int a[] = new int[4];
                for (int val = 2; val <= 14; ++val) {
                    for (int suite = 0; suite <= 3; ++suite) {
                        if (!set.contains(new Card(val, suite))) {
                            table[y.get(0)][x.get(0)] = new Card(val, suite);
                            for (int val0 = 2; val0 <= 14; val0 ++) {
                                for (int suite0 = 0; suite0 <= 3; ++suite0) {
                                    if (!set.contains(new Card(val0, suite0)) && !(new Card(val0, suite0)).equals(table[y.get(0)][x.get(0)])){
                                        table[y.get(1)][x.get(1)] = new Card(val0, suite0);
                                        if (goodTable(table, a)) {
                                            out.println("Solution exists.");
                                            Card card0 = table[y.get(0)][x.get(0)];
                                            Card card1 = table[y.get(1)][x.get(1)];
                                            //Replace J1 with x and J2 with y.
                                            out.println("Replace J1 with " + (cardToString((num.get(0)==1?card0:card1))) + " and J2 with " + (cardToString((num.get(0)==2?card0:card1))) + ".");
                                            out.println("Put the first square to (" + (a[1] + 1) + ", " + (a[0] + 1) + ").");
                                            out.println("Put the second square to ("+(a[3]+1)+", "+(a[2]+1)+").");
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                out.print("No solution.");
            }
        }



    }
    boolean goodTable(Card[][] table, int [] positions) {
        boolean ok = false;
        for (int Y = 0; Y < table.length - 2; ++Y) {
            for (int X = 0; X < table[0].length - 2; ++X) {
                for(int U = Y ; U < table.length - 2 ; ++U)
                    for (int V = X ; V < table[0].length - 2; ++V) {
                        if (U - Y < 3 && V - X < 3) continue;
                        if (goodSquare(X, Y, table) && goodSquare(V, U, table)) {
                            positions[0] = X;
                            positions[1] = Y;
                            positions[2] = V;
                            positions[3] = U;
                            return true;
                        }
                    }
            }
        }
        return false;
    }
    boolean goodSquare(int X, int Y, Card[][] table) {
        Set<Integer> suites = new HashSet<Integer> () ;
        Set<Integer> values = new HashSet<Integer> () ;
        for (int dx = 0; dx < 3; ++dx) {
            for (int dy = 0; dy < 3; ++dy) {
                suites.add(table[Y + dy][X + dx].suite);
                values.add(table[Y + dy][X + dx].value);
            }
        }
        return suites.size() == 1 || values.size() == 9;
    }
    BufferedReader br;
    PrintWriter out;
    StringTokenizer st;

    public static void main(String[] args) throws IOException {
        new taskD().run();
    }

    void run() throws IOException {
        /*out = new PrintWriter("input.txt");
        out.println(100000);
        for (int i =0 ; i < 100000; ++i) {
            out.print("0 ");
        }
        out.close();*/
        br = new BufferedReader(new InputStreamReader(System.in));
        //br = new BufferedReader(new FileReader("input.txt"));
        st = null;
        out = new PrintWriter(System.out);
        solve();
        br.close();
        out.close();
    }

    int nextInt() throws IOException {
        return Integer.parseInt(nextToken());
    }

    double nextDouble() throws IOException {
        return Double.parseDouble(nextToken());
    }

    long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }

    String nextToken() throws IOException {
        while (st == null || !st.hasMoreTokens()) {
            st = new StringTokenizer(br.readLine());
        }
        return st.nextToken();
    }
}
