import numpy
import time

n = int(input( ))
costo = numpy.zeros((n, n), dtype=int)
for i in range(n):
   costo[i] = numpy.array(list(map(int, input( ).split( ))), dtype=int)

t0 = time.time( )

memoria = numpy.zeros((n, 1 << n), dtype=int)
max_int = numpy.iinfo(numpy.int32).max
for w in range(1 << n):
   for i in range(n):
      faltantes = w
      if faltantes == 0:
         memoria[i, faltantes] = costo[i, 0]
      else:
         res = max_int
         for k in range(n):
            if (faltantes >> k) & 1:
               copia = faltantes & ~(1 << k)
               res = min(res, costo[i, k] + memoria[k, copia])
         memoria[i, faltantes] = res

faltantes_inicial = 0
for i in range(1, n):
   faltantes_inicial |= (1 << i)

t1 = time.time( )

print(memoria[0][faltantes_inicial])
print(t1 - t0)