import sys N = 40 def put(a, r, c): if 0 <= r < N and 0 <= c < N and a[r][c] != "P": a[r][c] = "." def paths(a): zero = [[0] * N for _ in range(N)] one = [[0] * N for _ in range(N)] for r in range(N): for c in range(N): if a[r][c] == "#": continue if r == c == 0: zero[r][c] = 1 continue z = (zero[r - 1][c] if r else 0) + (zero[r][c - 1] if c else 0) o = (one[r - 1][c] if r else 0) + (one[r][c - 1] if c else 0) if a[r][c] == "P": one[r][c] = z else: zero[r][c], one[r][c] = z, o return one[-1][-1] def connect(a, cells, upper): if not cells: return cells.sort() r, c = cells[0] for nr, nc in cells[1:]: if upper: for x in range(c, nc + 1): put(a, r, x) for y in range(r, nr + 1): put(a, y, nc) else: for y in range(r, nr + 1): put(a, y, c) for x in range(c, nc + 1): put(a, nr, x) r, c = nr, nc if upper: for x in range(c, N): put(a, r, x) for y in range(r, N): put(a, y, N - 1) else: for y in range(r, N): put(a, y, c) for x in range(c, N): put(a, N - 1, x) def build(m): a = [["#"] * N for _ in range(N)] switches, upper, lower = [], [], [] r = c = stage = 0 while True: if stage % 2 == 0: if r + 4 >= N - 1 or c + 4 >= N - 1: break for y in range(r, r + 3): for x in range(c, c + 2): put(a, y, x) switches += [(r, c + 2), (r + 1, c + 2)] upper += [(r, c + 3), (r + 1, c + 3)] for cell in upper[-2:]: put(a, *cell) put(a, r + 3, c + 1) put(a, r + 3, c + 2) r, c = r + 3, c + 2 else: if r + 4 >= N - 1 or c + 4 >= N - 1: break for y in range(r, r + 2): for x in range(c, c + 3): put(a, y, x) switches += [(r + 2, c), (r + 2, c + 1)] lower += [(r + 3, c), (r + 3, c + 1)] for cell in lower[-2:]: put(a, *cell) put(a, r + 1, c + 3) put(a, r + 2, c + 3) r, c = r + 2, c + 3 stage += 1 connect(a, upper, True) connect(a, lower, False) values = [] for r, c in switches: b = [row[:] for row in a] b[r][c] = "P" values.append(paths(b)) chosen = [] for i in sorted(range(len(values)), key=lambda i: values[i], reverse=True): if 0 < values[i] <= m: m -= values[i] chosen.append(i) if m: return None for i in chosen: r, c = switches[i] a[r][c] = "P" a = [list(reversed(row)) for row in reversed(a)] for r in range(N): for c in range(N): if a[r][c] == "P": a[r][c] = "." a[0][0] = a[-1][-1] = "." a[0][1] = a[1][0] = "P" return a data = list(map(int, sys.stdin.buffer.read().split())) answer = [] for m in data[1:]: grid = build(m) answer += ["-1"] if grid is None else [str(N)] + ["".join(row) for row in grid] print("\n".join(answer))