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.io.*;
import java.util.*;

import static java.lang.Math.*;
import static java.util.Arrays.fill;
import static java.util.Arrays.binarySearch;
import static java.util.Arrays.sort;

public class Main {
	public static void main(String[] args) throws IOException {
		new Thread(null, new Runnable() {
			public void run() {
				try {
					try {
						if (new File("input.txt").exists())
							System.setIn(new FileInputStream("input.txt"));
					} catch (SecurityException e) {}
					new Main().run();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}, "1", 1L << 24).start(); 
	}

	BufferedReader in;
	PrintWriter out;
	StringTokenizer st = new StringTokenizer("");
	
	int N;
	int M;
	int[][] cards;
	
	String[] val = { "2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A" };
	String[] suit = { "C", "D", "H", "S" };
	
	Map<String, Integer> map = new HashMap<String, Integer>();
	String[] label;

	boolean[] used = new boolean [54];
	List<Integer> has = new ArrayList<Integer>();
	List<Integer>[] hasValue = new ArrayList[13];
	List<Integer>[] hasSuit = new ArrayList[4];
	
	int[] nJ = { -1, -1};
	
	void run() throws IOException {
		for (String v : val)
			for (String s : suit)
				map.put(v + s, map.size());
		map.put("J1", map.size());
		map.put("J2", map.size());
		
		label = new String [map.size()];
		int k = 0;
		for (String s : map.keySet())
			label[k++] = s;
		
		in = new BufferedReader(new InputStreamReader(System.in));
		out = new PrintWriter(System.out);
		
		N = nextInt();
		M = nextInt();
		
		cards = new int [N][M];
		for (int i = 0; i < N; i++)
			for (int j = 0; j < M; j++) {
				cards[i][j] = map.get(nextToken());
				used[cards[i][j]] = true;
			}
		
		for (int v = 0; v < 13; v++)
			hasValue[v] = new ArrayList<Integer>(5);
		
		for (int s = 0; s < 4; s++)
			hasSuit[s] = new ArrayList<Integer>(14);
		
		for (int i = 0; i < 52; i++) {
			if (!used[i]) {
				has.add(i);
				hasValue[getVal(i)].add(i);
				hasSuit[getSuit(i)].add(i);
			}
		}
		
		for (int i = 0; i + 3 <= N; i++)
			for (int j = 0; j + 3 <= M; j++)
				for (int u = 0; u + 3 <= N; u++) {
					for (int v = 0; v + 3 <= M; v++) {
						if (its(i, i + 3 - 1, u, u + 3 - 1) && its(j, j + 3 - 1, v, v + 3 - 1))
							continue;
//						System.out.println(i + " " + j + " " + u + " " + v);
						if (solve(i, j, u, v)) {
							out.println("Solution exists.");
							printJokers();
							out.println("Put the first square to (" + (i + 1) + ", " + (j + 1) + ").");
							out.println("Put the second square to (" + (u + 1) + ", " + (v + 1) + ").");
							out.close();
							return;
						}
					}
				}
		
		out.println("No solution.");
		out.close();
	}
	
	void printJokers() {
		int j1 = nJ[0];
		int j2 = nJ[1];
		
		if (j1 == -1 && j2 == -1) {
			out.println("There are no jokers.");
		} else if (j1 != -1 && j2 != -1) {
			out.println("Replace J1 with " + label(j1) + " and J2 with " + label(j2) + ".");
		} else if (j1 != -1) {
			out.println("Replace J1 with " + label(j1) + ".");
		} else {
			out.println("Replace J2 with " + label(j2) + ".");
		}
	}

	int getVal(int c) {
		return c / 4;
	}
	
	int getSuit(int c) {
		return c % 4;
	}
	
	boolean isJoker(int c) {
		return c > 51;
	}

	boolean solve(int r1, int c1, int r2, int c2) {
		int j1 = count(r1, c1);
		int j2 = count(r2, c2);
		if (j1 == 0 && j2 == 0) {
			if (good(r1, c1) && good(r2, c2)) {
				replaceLast();
				return true;
			}
		} else if (j1 == 1 && j2 == 0) {
			if (solve10(r1, c1, r2, c2)) {
				replaceLast();
				return true;
			}
		} else if (j1 == 0 && j2 == 1) {
			if (solve10(r2, c2, r1, c1)) {
				replaceLast();
				return true;
			}
		} else if (j1 == 1 && j2 == 1) {
			if (solve11(r1, c1, r2, c2)) {
				return true;
			}
		} else if (j1 == 2) {
			if (solve20(r1, c1, r2, c2)) {
				return true;
			}
		} else {
			if (solve20(r2, c2, r1, c1)) {
				return true;
			}
		}
		
		return false;
	}

	List<Integer> rep1 = new ArrayList<Integer>(100);
	List<Integer> rep2 = new ArrayList<Integer>(100);
	
	boolean solve10(int r1, int c1, int r2, int c2) {
		if (!good(r2, c2))
			return false;
		int j = buildGood(r1, c1, rep1);
		if (rep1.size() > 0) {
			setJoker(j, rep1.get(0));
			return true;
		} else {
			return false;
		}
	}
	
	boolean solve11(int r1, int c1, int r2, int c2) {
		int j1 = buildGood(r1, c1, rep1);
		int j2 = buildGood(r2, c2, rep2);
		
		if (rep1.size() > 0 && rep2.size() > 0) {
			if (rep1.size() > 1) {
				setJoker(j2, rep2.get(0));
				for (int x : rep1)
					if (x != nJ[j2]) {
						setJoker(j1, x);
						break;
					}
				return true;
			} else if (rep2.size() > 1) {
				setJoker(j1, rep1.get(0));
				for (int x : rep2)
					if (x != nJ[j1]) {
						setJoker(j2, x);
						break;
					}
				return true;
			} else {
				if (rep1.get(0) == rep2.get(0))
					return false;
				nJ[j1] = rep1.get(0);
				nJ[j2] = rep2.get(0);
				return true;
			}
		} else {
			return false;
		}
	}

	boolean solve20(int r1, int c1, int r2, int c2) {
		if (!good(r2, c2))
			return false;
		for (int i = 0; i < has.size(); i++)
			for (int j = 0; j < has.size(); j++) {
				if (i != j) {
					setJoker(0, has.get(i));
					setJoker(1, has.get(j));
					if (good(r1, c1))
						return true;
				}
			}
		setJoker(0, 52);
		setJoker(1, 53);
		return false;
	}
	
	void setJoker(int jk, int x) {
		nJ[jk] = x;
		for (int i = 0; i < N; i++)
			for (int j = 0; j < M; j++)
				if (cards[i][j] == 52 + jk) {
					cards[i][j] = x;
					return;
				}
	}

	int[] usedVal = new int [55];
	int uvTick = 1;
	int[] sCount = new int [4];
	
	int buildGood(int r, int c, List<Integer> good) {
		int ret = -1;
		int s = -1;
		uvTick++;
		boolean ok = true;
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++) {
				int cr = cards[r + i][c + j];
				if (isJoker(cr)) {
					ret = cr - 52;
				} else {
					if (s == -1 || s == getSuit(cr)) {
						s = getSuit(cr);
					} else {
						s = -2;
					}
					if (usedVal[getVal(cr)] == uvTick)
						ok = false;
					usedVal[getVal(cr)] = uvTick;
				}
			}
		good.clear();
		if (s >= 0) {
			good.addAll(hasSuit[s]);
		}
		if (ok) {
			for (int v = 0; v < 13; v++) {
				if (usedVal[v] != uvTick) {
					good.addAll(hasValue[v]);
				}
			}
		}
		return ret;
	}

	void replaceLast() {
		for (int i = 0; i < N; i++)
			for (int j = 0; j < M; j++) {
				int c = cards[i][j];
				if (isJoker(c)) {
					setJoker(c - 52, has.get(has.size() - 1));
					has.remove(has.size() - 1);
				}
			}
	}

	String label(int c) {
		return label[c];
	}

	boolean good(int r1, int c1) {
		boolean ok1 = true;
		boolean ok2 = true;
		int s = getSuit(cards[r1][c1]);
		uvTick++;
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++) {
				int c = cards[r1 + i][c1 + j];
				if (isJoker(c)) return false;
				if (getSuit(c) != s)
					ok1 = false;
				if (usedVal[getVal(c)] == uvTick)
					ok2 = false;
				else
					usedVal[getVal(c)] = uvTick;
			}
		return ok1 || ok2;
	}

	int count(int r1, int c1) {
		int ret = 0;
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				if (isJoker(cards[r1 + i][c1 + j])) ret++;
		return ret;
	}

	boolean its(int l1, int r1, int l2, int r2) {
		return max(l1, l2) <= min(r1, r2);
	}


	/*************************************************************** 
	 * Input 
	 **************************************************************/
	String nextToken() throws IOException {
		while (!st.hasMoreTokens())
			st = new StringTokenizer(in.readLine());
		return st.nextToken();
	}
	
	int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}
	
	long nextLong() throws IOException {
		return Long.parseLong(nextToken());
	}
	
	double nextDouble() throws IOException {
		return Double.parseDouble(nextToken());
	}
	
	String nextLine() throws IOException {
		st = new StringTokenizer("");
		return in.readLine();
	}
	
	boolean EOF() throws IOException {
		while (!st.hasMoreTokens()) {
			String s = in.readLine();
			if (s == null)
				return true;
			st = new StringTokenizer(s);
		}
		return false;
	}
}
