# your code goes heren = 0
m = []
cMin = float('inf')
fmin = float('inf')
path = 0
visited = []
def Try(k, pos):
global fmin, path, visited, m, n, cMin
if k == n:
current_total_path = path + m[pos][0]
if fmin > current_total_path:
fmin = current_total_path
return
for i in range(1, n):
if not visited[i]:
path += m[pos][i]
visited[i] = True
if path + cMin * (n-k) <= fmin:
Try(k + 1, i)
visited[i] = False
path -= m[pos][i]
def main():
global n, m, cMin, fmin, visited
n = int(input())
visited = [False] * n
m = [list(map(int, input().split())) for _ in range(n)]
for i in range(n):
for j in range(n):
if i != j and m[i][j] < cMin:
cMin = m[i][j]
visited[0] = True
Try(1, 0)
print(fmin)
main()
IyB5b3VyIGNvZGUgZ29lcyBoZXJlbiA9IDAKbSA9IFtdCmNNaW4gPSBmbG9hdCgnaW5mJykgIApmbWluID0gZmxvYXQoJ2luZicpCnBhdGggPSAwCnZpc2l0ZWQgPSBbXQoKZGVmIFRyeShrLCBwb3MpOgogICAgZ2xvYmFsIGZtaW4sIHBhdGgsIHZpc2l0ZWQsIG0sIG4sIGNNaW4KICAgIGlmIGsgPT0gbjoKICAgICAgICBjdXJyZW50X3RvdGFsX3BhdGggPSBwYXRoICsgbVtwb3NdWzBdCiAgICAgICAgaWYgZm1pbiA+IGN1cnJlbnRfdG90YWxfcGF0aDoKICAgICAgICAgICAgZm1pbiA9IGN1cnJlbnRfdG90YWxfcGF0aAogICAgICAgIHJldHVybgoKICAgIGZvciBpIGluIHJhbmdlKDEsIG4pOiAKICAgICAgICBpZiBub3QgdmlzaXRlZFtpXToKICAgICAgICAgICAgcGF0aCArPSBtW3Bvc11baV0KICAgICAgICAgICAgdmlzaXRlZFtpXSA9IFRydWUKICAgICAgICAgICAgaWYgcGF0aCArIGNNaW4gKiAobi1rKSA8PSBmbWluOgogICAgICAgICAgICAgICAgVHJ5KGsgKyAxLCBpKQogICAgICAgICAgICB2aXNpdGVkW2ldID0gRmFsc2UKICAgICAgICAgICAgcGF0aCAtPSBtW3Bvc11baV0KCmRlZiBtYWluKCk6CiAgICBnbG9iYWwgbiwgbSwgY01pbiwgZm1pbiwgdmlzaXRlZCAKCiAgICBuID0gaW50KGlucHV0KCkpCiAgICB2aXNpdGVkID0gW0ZhbHNlXSAqIG4gIAogICAgbSA9IFtsaXN0KG1hcChpbnQsIGlucHV0KCkuc3BsaXQoKSkpIGZvciBfIGluIHJhbmdlKG4pXQoKICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgIGZvciBqIGluIHJhbmdlKG4pOgogICAgICAgICAgICBpZiBpICE9IGogYW5kIG1baV1bal0gPCBjTWluOgogICAgICAgICAgICAgICAgY01pbiA9IG1baV1bal0KCiAgICB2aXNpdGVkWzBdID0gVHJ1ZSAKICAgIFRyeSgxLCAwKSAKCiAgICBwcmludChmbWluKQoKbWFpbigp