import Control.Monad
import Data.Maybe
import qualified Data.ByteString.Char8 as BS
import Data.List
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Unboxed.Mutable as VUM
import Data.Array.Unboxed

readInt = fst . fromJust . BS.readInt
readIntList = map readInt . BS.words
getInt = readInt <$> BS.getLine
getIntList = readIntList <$> BS.getLine

main = do
    [n,c] <- getIntList
    ds <- array ((1,1),(c,c)) . zip [(i,j)|i<-[1..c],j<-[1..c]] . concat <$> replicateM c getIntList :: IO(UArray (Int,Int) Int)
    cs <- array ((1,1),(n,n)) . zip [(i,j)|i<-[1..n],j<-[1..n]] . concat <$> replicateM n getIntList :: IO(UArray (Int,Int) Int)

    v0 <- VUM.replicate c (0 :: Int)
    v1 <- VUM.replicate c (0 :: Int)
    v2 <- VUM.replicate c (0 :: Int)
    forM_ [1..n] $ \i -> do
        forM_ [1..n] $ \j -> do
            let a = (i+j) `mod` 3
            let cij = (cs ! (i,j)) - 1
            when (a == 0) $ VUM.modify v0 succ cij
            when (a == 1) $ VUM.modify v1 succ cij
            when (a == 2) $ VUM.modify v2 succ cij
    fv0 <- VU.unsafeFreeze v0
    fv1 <- VU.unsafeFreeze v1
    fv2 <- VU.unsafeFreeze v2

    let colors = [(c0,c1,c2)| c0 <- [0..c-1], c1 <-[0..c-1], c2 <- [0..c-1], c0 /= c1, c1 /= c2, c2 /= c0]
    let ans = minimum $ map f colors
            where f (c0,c1,c2) = s0 + s1 + s2
                      where s0 = sum $ map (\ci -> (fv0 VU.! ci) * (ds ! (ci+1,c0+1))) [0..c-1]
                            s1 = sum $ map (\ci -> (fv1 VU.! ci) * (ds ! (ci+1,c1+1))) [0..c-1]
                            s2 = sum $ map (\ci -> (fv2 VU.! ci) * (ds ! (ci+1,c2+1))) [0..c-1]
    print ans