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.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {

	static String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K","A"};
	static String[] suits = {"C", "D", "H","S"};
	static int n,m;
	static String[][] a;
	static HashSet<String> deck;
	static ArrayList<String> missingCards;
	
	public static void main(String[] args) throws Throwable {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		a = new String[n][m];
		deck = new HashSet<>();
		missingCards = new ArrayList<>();
		boolean j1 = false , j2 = false;
		Point p1 = new Point() , p2 = new Point();
		
		for (int i = 0; i < n; i++) 
			for (int j = 0; j < m; j++) 
				a[i][j] = sc.next();
		
		for (int i = 0; i < n; i++) 
		{
			for (int j = 0; j < m; j++) 
			{
				if(a[i][j].equals("J1"))
				{
					j1 = true;
					p1 = new Point(i, j);
				}
				else if(a[i][j].equals("J2"))
				{
					j2 = true;
					p2 = new Point(i, j);
				}
				else
					deck.add(a[i][j]);
			}
		}
		
		for (int i = 0; i < ranks.length; i++) 
			for (int j = 0; j < suits.length; j++) 
				if(!deck.contains(ranks[i] + suits[j]))
					missingCards.add(ranks[i] + suits[j]);
		
		if(!j1 && !j2)
		{
			Point[] ans = solve();
			if(ans!=null)
			{
				System.out.println("Solution exists.");
				System.out.println("There are no jokers.");
				System.out.println("Put the first square to ("+ans[0].y+", "+ans[0].x+").");
				System.out.println("Put the second square to ("+ans[1].y+", "+ans[1].x+").");
				return;
			}
		}
		else if(j1 && !j2)
		{
			a[p1.x][p1.y] = missingCards.get(0);
			Point[] ans = solve();
			if(ans!=null)
			{
				System.out.println("Solution exists.");
				System.out.println("Replace J1 with "+missingCards.get(0)+".");
				System.out.println("Put the first square to ("+ans[0].y+", "+ans[0].x+").");
				System.out.println("Put the second square to ("+ans[1].y+", "+ans[1].x+").");
				return;
			}
		}
		else if(!j1 && j2)
		{
			a[p2.x][p2.y] = missingCards.get(0);
			Point[] ans = solve();
			if(ans!=null)
			{
				System.out.println("Solution exists.");
				System.out.println("Replace J2 with "+missingCards.get(0)+".");
				System.out.println("Put the first square to ("+ans[0].y+", "+ans[0].x+").");
				System.out.println("Put the second square to ("+ans[1].y+", "+ans[1].x+").");
				return;
			}
		}
		else 
		{
			a[p1.x][p1.y] = missingCards.get(0);
			a[p2.x][p2.y] = missingCards.get(1);
			Point[] ans = solve();
			if(ans!=null)
			{
				System.out.println("Solution exists.");
				System.out.println("Replace J1 with "+missingCards.get(0)+" and J2 with "+missingCards.get(1)+".");
				System.out.println("Put the first square to ("+ans[0].y+", "+ans[0].x+").");
				System.out.println("Put the second square to ("+ans[1].y+", "+ans[1].x+").");
				return;
			}
			a[p1.x][p1.y] = missingCards.get(1);
			a[p2.x][p2.y] = missingCards.get(0);
			ans = solve();
			if(ans!=null)
			{
				System.out.println("Solution exists.");
				System.out.println("Replace J1 with "+missingCards.get(1)+" and J2 with "+missingCards.get(0)+".");
				System.out.println("Put the first square to ("+ans[0].y+", "+ans[0].x+").");
				System.out.println("Put the second square to ("+ans[1].y+", "+ans[1].x+").");
				return;
			}
		}
		System.out.println("No solution.");
	}
	
	static Point[] solve()
	{
		boolean[] suitCheck = new boolean[53] , rankCheck = new boolean[53];
		for (int i = 0; i < n; i++) 
		{
			for (int j = 0; j < m; j++) 
			{
				int idx = (i*m)+j;
				if(isValidBox(i, j))
				{
					suitCheck[idx] = check1(new Point(i, j));
					rankCheck[idx] = check2(new Point(i, j));
				}
			}
		}
		
		for(int i = 0; i < suitCheck.length;i++)
		{
			for(int j = i+1; j < suitCheck.length;j++)
			{
				Point p1 = new Point(1+i%m,1+i/m) , p2 = new Point(1+ j%m,1+j/m);
				if(!boxesAreIntersecting(p1, p2) && (suitCheck[i] || rankCheck[i]) && (suitCheck[j] || rankCheck[j]))
				{
					Point[] res = {p1,p2};
					return res;
				}
			}
		}
		return null;
	}
	
	static boolean isValidBox(int i , int j){return i>=0 && j>=0 && i<n && j<m && i+2<n && j+2<m;}
	
	static boolean boxesAreIntersecting(Point p1,Point p2)
	{
		return 	   pointInBox(p1,p2) 
				|| pointInBox(new Point(p1.x+2, p1.y),p2)
				|| pointInBox(new Point(p1.x, p1.y+2), p2)
				|| pointInBox(new Point(p1.x+2, p1.y+2), p2);
	}
	
	static boolean pointInBox(Point p,Point box){return p.x>=box.x && p.x<box.x+3 && p.y>=box.y && p.y<box.y+3;}
	
	// same suit
	static boolean check1(Point p)
	{
		char suit = a[p.x][p.y].charAt(1);
		for(int i = p.x; i < p.x+3;i++)
		{
			for(int j = p.y; j < p.y+3;j++)
			{
				if(a[i][j].charAt(1) != suit)
					return false;
			}
		}
		return true;
	}
	
	// pairwise different ranks
	static boolean check2(Point p)
	{
		HashMap<Character,Integer> ranks = new HashMap<>();
		for(int i = p.x; i < p.x+3;i++)
			for(int j = p.y; j < p.y+3;j++)
				put(ranks,a[i][j].charAt(0),1);
		for(int i = p.x; i < p.x+3;i++)
		{
			for(int j = p.y; j < p.y+3;j++)
			{
				put(ranks,a[i][j].charAt(0),-1);
				if(ranks.containsKey(a[i][j].charAt(0)) && ranks.get(a[i][j].charAt(0))>0)
					return false;
				put(ranks,a[i][j].charAt(0),1);
			}
		}
		return true;
	}
	
	static void put(HashMap<Character, Integer>map,char c,int v)
	{
		if(!map.containsKey(c))
			map.put(c, 0);
		map.put(c, v+map.get(c));
	}
	
	static class Scanner {
		StringTokenizer st;
		BufferedReader br;
		public Scanner(InputStream s) {br = new BufferedReader(new InputStreamReader(s));}
		public Scanner(String file) throws FileNotFoundException {br = new BufferedReader(new FileReader(file));}
		public String next() throws IOException {while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();}
		public int nextInt() throws IOException {return Integer.parseInt(next());}
		public long nextLong() throws IOException {return Long.parseLong(next());}
		public String nextLine() throws IOException {return br.readLine();}
		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}
		public int[] nexIntArray() throws Throwable {
			st = new StringTokenizer(br.readLine());
			int[] a = new int[st.countTokens()];
			for (int i = 0; i < a.length; i++)a[i] = nextInt();
			return a;
		}
		public boolean ready() throws IOException {return br.ready();}
	}
}