import sys
sys.setrecursionlimit(1000000)

If True:
    if 0==0:
        # Start Input code ---------------------------------------
        N,C=map(int,input().split())
        c=[[0 for j in range(C)] for i in range(3)]
        D=[[0 for i in range(C)] for j in range(C)]
        for i in range(C):
            D[i]=[int(x) for x in input().split()]
        for x in range(N):
            y=0
            for j in input().split():
                c[(x+y)%3][int(j)-1]+=1
                y+=1
        # End Input code ---------------------------------------

St=[[0 for i in range(3)] for j in range(C)]
ans=10**20
for c1 in range(C):
    for c2 in range(C):
        for c3 in range(C):
            cc=0
            dd=0
            for i in range(C):
                cc+=c[0][i]*D[i][c1]
                cc+=c[1][i]*D[i][c2]
                cc+=c[2][i]*D[i][c3]
            if len(set([c1,c2,c3]))==3:
                ans=min(ans,cc)
print(ans)


### FIXED CODE ###

import sys
sys.setrecursionlimit(1000000)
#def input():
#    return sys.stdin.readline()[:-1]

'''
n=int(input())
for i in range(n):
    a[i]=int(input())
    a[i],b[i]=map(int,input().split())
a=[int(x) for x in input().split()]
n,m=map(int,input.split())
from operator import itemgetter
a = [(1, "c", 1), (1, "b", 3), (2, "a", 0), (1, "a", 2)]
print(sorted(a))  # 0 番目の要素でソート、先頭の要素が同じなら 1 番目以降の要素も見る
print(sorted(a, key=itemgetter(0)))  # 0 番目の要素だけでソート
print(sorted(a, key=itemgetter(0, 2)))  # 0 番目と 2 番目の要素でソート
print(sorted(a, key=lambda x: x[0] * x[2]))  # 0 番目の要素 * 2 番目の要素でソート
print(sorted(a, reverse=True))  # 降順にソート
a.sort()  # 破壊的にソート、sorted() よりも高速
try: # エラーキャッチ list index out of range
    for i in range():
        k=b[i]
except IndexError as e:
    print(i)
'''

test_data1 = '''\
2 3
0 1 1
1 0 1
1 4 0
1 2
3 3
'''

test_data2 = '''\
4 3
0 12 71
81 0 53
14 92 0
1 1 2 1
2 1 1 2
2 2 1 3
1 1 2 2
'''

test_data3 = '''\

'''
td_num=2

def GetTestData(index):
    if index==1:
        return test_data1
    if index==2:
        return test_data2
    if index==3:
        return test_data3

if False:
    with open("../test.txt", mode='w') as f:
        f.write(GetTestData(td_num))
    with open("../test.txt") as f:
        # Start Input code ---------------------------------------
        N,C=map(int,f.readline().split())
        c=[[0 for j in range(C)] for i in range(3)]
        D=[[0 for i in range(C)] for j in range(C)]
        for i in range(C):
            D[i]=[int(x) for x in f.readline().split()]
        for x in range(N):
            y=0
            for j in f.readline().split():
                c[(x+y)%3][int(j)-1]+=1
                y+=1
        # End Input code ---------------------------------------
else:
    if 0==0:
        # Start Input code ---------------------------------------
        N,C=map(int,input().split())
        c=[[0 for j in range(C)] for i in range(3)]
        D=[[0 for i in range(C)] for j in range(C)]
        for i in range(C):
            D[i]=[int(x) for x in input().split()]
        for x in range(N):
            y=0
            for j in input().split():
                c[(x+y)%3][int(j)-1]+=1
                y+=1
        # End Input code ---------------------------------------

St=[[0 for i in range(3)] for j in range(C)]
ans=10**20
for c1 in range(C):
    for c2 in range(C):
        for c3 in range(C):
            cc=0
            dd=0
            for i in range(C):
                cc+=c[0][i]*D[i][c1]
                cc+=c[1][i]*D[i][c2]
                cc+=c[2][i]*D[i][c3]
                
                dd+=c[0][i]*D[c1][i]
                dd+=c[1][i]*D[c2][i]
                dd+=c[2][i]*D[c3][i]
            if len(set([c1,c2,c3]))==3:
                ans=min(ans,cc)
            #print(ans,c,D)
#print('N,C=',N,C,'D=',D,'c=',c,'St=',St)
print(ans)