N, M = map(int, input().split())
arr = []
virus = []
for i in range(N):
arr.append(list(map(int, input().split())))
for j in range(N):
if arr[i][j] == 2: # 바이러스
virus.append((i, j))
arr[i][j] = 0 # 미리 바이러스 가능공간 0으로 없애버리기
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
def solve(tlst):
# make a wall
w = [[0] * N for _ in range(N)]
# [1] virus 넣어
q = []
for tx, ty in tlst:
w[tx][ty] = 1
q.append((tx, ty))
m = 0
while q:
cx, cy = q.pop(0)
for i in range(4):
nx, ny = cx+dx[i], cy+dy[i]
if 0<=nx<N and 0<=ny<N and w[nx][ny] == 0 and arr[nx][ny] == 0:
w[nx][ny] = w[cx][cy]+1
q.append((nx, ny))
m = max(m, w[nx][ny])
for i in range(N):
for j in range(N):
if w[i][j] == 0 and arr[i][j] == 0: # 그냥 길인데, 방문안한곳이 있다면
return float("inf")
# print("m: ", m-1, tlst)
if m>0:
return m-1
return m
ans = float("inf")
def bfs(n, lst):
global ans
if len(lst) == M:
ans = min(ans, solve(lst))
return
for i in range(n, len(virus)):
if v[i] == 0:
v[i] = 1
bfs(i+1, lst+[virus[i]])
v[i] = 0
return
v = [0]*(len(virus))
bfs(0, [])
if ans == float("inf"):
ans = -1
print(ans)
N, M = map(int, input().split())
arr = []
path = []
virus = []
for i in range(N):
arr.append(list(map(int, input().split())))
for j in range(M):
if arr[i][j] == 0:
path.append((i, j))
elif arr[i][j] == 2:
virus.append((i, j))
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
def bfs(tlst):
# [1] make wall 3 times
for tx, ty in tlst:
arr[tx][ty] = 1
# [2] initialize virus info
q = []
w = [[0]*M for _ in range(N)]
for vx, vy in virus:
w[vx][vy] = 1
q.append((vx, vy))
chance = cnt-3
while q:
cx, cy = q.pop(0)
for i in range(4):
nx, ny = cx+dx[i], cy+dy[i]
if 0<=nx<N and 0<=ny<M and w[nx][ny] == 0 and arr[nx][ny] == 0:
w[nx][ny] = 1
q.append((nx, ny))
chance-=1
# reset
for tx, ty in tlst:
arr[tx][ty] = 0
return chance
cnt = len(path)
ans = 0
for i in range(cnt-2):
for j in range(i+1, cnt-1):
for k in range(j+1, cnt):
ans = max(ans, bfs([path[i], path[j], path[k]]))
print(ans)
N, M = map(int, input().split())
tmp = [i for i in range(N+1)]
def DF(lst):
if len(lst)==M:
print(" ".join(map(str, lst)))
return
for i in range(1, N+1):
DF(lst+[tmp[i]])
DF([])
#2.
N, M = map(int, input().split())
tmp = [i for i in range(N+1)]
v = [0]*(N+1)
def DF(lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for i in range(1, N+1):
if v[i] == 0:
v[i] = 1
DF(lst+[tmp[i]])
v[i] = 0
DF([])
#3.
N, M = map(int, input().split())
tmp = [i for i in range(N+1)]
v = [0]*(N+1)
def DF(s, lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for i in range(s, N+1):
if v[i] == 0:
v[i] = 1
DF(i, lst+[tmp[i]])
v[i] = 0
DF(1, [])
#4.
N, M = map(int, input().split())
tmp = [i for i in range(N+1)]
def DF(s, lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for i in range(s, N+1):
DF(i, lst+[tmp[i]])
DF(1, [])
#5.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
v = [0]*(N+1)
def DF(lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for idx, i in enumerate(arr):
if v[idx] == 0:
v[idx] = 1
DF(lst+[arr[idx]])
v[idx] = 0
DF([])
#6.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
v = [0]*(N)
def DF(s, lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for i in range(s, len(arr)):
if v[i] == 0:
v[i] = 1
DF(i, lst+[arr[i]])
v[i] = 0
DF(0, [])
#7.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
def DF(lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for i in range(len(arr)):
DF(lst+[arr[i]])
DF([])
#8.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
def DF(s, lst):
if len(lst) == M:
print(" ".join(map(str, lst)))
return
for i in range(s, len(arr)):
DF(i, lst+[arr[i]])
DF(0, [])
# 9.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
ll = []
v = [0]*N
def DF(lst):
if len(lst) == M:
if lst not in ll:
print(" ".join(map(str, lst)))
ll.append(lst)
return
for i in range(len(arr)):
if v[i] == 0:
v[i] = 1
DF(lst+[arr[i]])
v[i] = 0
DF([])
#10.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
v = [0]*N
ll = []
def DF(s, lst):
if len(lst) == M:
if lst not in ll:
ll.append(lst)
print(" ".join(map(str, lst)))
return
for i in range(s, len(arr)):
if v[i] == 0:
v[i] = 1
DF(i, lst+[arr[i]])
v[i] = 0
DF(0, [])
# 11.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
ll = []
def DF(lst):
if len(lst) == M:
if lst not in ll:
print(" ".join(map(str, lst)))
ll.append(lst)
return
for i in range(len(arr)):
DF(lst+[arr[i]])
DF([])
#12.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
ll = []
def DF(s, lst):
if len(lst) == M:
if lst not in ll:
ll.append(lst)
print(" ".join(map(str, lst)))
return
for i in range(s, len(arr)):
DF(i, lst+[arr[i]])
DF(0, [])