← Home
 ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	fmt.Fscan(reader, &n, &m)

	grid := make([][]string, n)
	for i := 0; i < n; i++ {
		grid[i] = make([]string, m)
		for j := 0; j < m; j++ {
			fmt.Fscan(reader, &grid[i][j])
		}
	}

	ranks := []string{"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"}
	suits := []string{"C", "D", "H", "S"}

	var j1r, j1c, j2r, j2c int
	hasJ1, hasJ2 := false, false
	usedStandard := make(map[string]bool)

	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			card := grid[i][j]
			if card == "J1" {
				j1r, j1c = i, j
				hasJ1 = true
			} else if card == "J2" {
				j2r, j2c = i, j
				hasJ2 = true
			} else {
				usedStandard[card] = true
			}
		}
	}

	var available []string
	for _, r := range ranks {
		for _, s := range suits {
			card := r + s
			if !usedStandard[card] {
				available = append(available, card)
			}
		}
	}

	if !hasJ1 && !hasJ2 {
		if ok, r1, c1, r2, c2 := findTwoSquares(grid); ok {
			printResult("There are no jokers.", r1, c1, r2, c2)
			return
		}
	} else if hasJ1 && !hasJ2 {
		for _, card := range available {
			grid[j1r][j1c] = card
			if ok, r1, c1, r2, c2 := findTwoSquares(grid); ok {
				printResult(fmt.Sprintf("Replace J1 with %s.", card), r1, c1, r2, c2)
				return
			}
		}
	} else if !hasJ1 && hasJ2 {
		for _, card := range available {
			grid[j2r][j2c] = card
			if ok, r1, c1, r2, c2 := findTwoSquares(grid); ok {
				printResult(fmt.Sprintf("Replace J2 with %s.", card), r1, c1, r2, c2)
				return
			}
		}
	} else {
		for i := 0; i < len(available); i++ {
			for j := 0; j < len(available); j++ {
				if i == j {
					continue
				}
				card1, card2 := available[i], available[j]
				grid[j1r][j1c] = card1
				grid[j2r][j2c] = card2
				if ok, r1, c1, r2, c2 := findTwoSquares(grid); ok {
					printResult(fmt.Sprintf("Replace J1 with %s and J2 with %s.", card1, card2), r1, c1, r2, c2)
					return
				}
			}
		}
	}

	fmt.Println("No solution.")
}

func findTwoSquares(grid [][]string) (bool, int, int, int, int) {
	n := len(grid)
	m := len(grid[0])
	var valid [][2]int

	for i := 0; i <= n-3; i++ {
		for j := 0; j <= m-3; j++ {
			if isGoodSquare(grid, i, j) {
				valid = append(valid, [2]int{i, j})
			}
		}
	}

	for i := 0; i < len(valid); i++ {
		for j := i + 1; j < len(valid); j++ {
			r1, c1 := valid[i][0], valid[i][1]
			r2, c2 := valid[j][0], valid[j][1]
			if !overlap(r1, c1, r2, c2) {
				return true, r1, c1, r2, c2
			}
		}
	}
	return false, 0, 0, 0, 0
}

func isGoodSquare(grid [][]string, r, c int) bool {
	suit := grid[r][c][1]
	sameSuit := true
	ranks := make(map[byte]bool)

	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			card := grid[r+i][c+j]
			if card[1] != suit {
				sameSuit = false
			}
			ranks[card[0]] = true
		}
	}

	if sameSuit {
		return true
	}
	return len(ranks) == 9
}

func overlap(r1, c1, r2, c2 int) bool {
	return r1 <= r2+2 && r2 <= r1+2 && c1 <= c2+2 && c2 <= c1+2
}

func printResult(msg string, r1, c1, r2, c2 int) {
	fmt.Println("Solution exists.")
	fmt.Println(msg)
	fmt.Printf("Put the first square to (%d, %d).\n", r1+1, c1+1)
	fmt.Printf("Put the second square to (%d, %d).\n", r2+1, c2+1)
}
```