using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;
using static System.Math;
using System.Numerics;

namespace AtCoder
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
            Solve();
            //Out.Flush();
            Read();
        }

        static void Solve()
        {
            var (N, C) = Slice2<long>();
            var Dij = new long[C][];
            var Cij = new long[N][];
            for (var i = 0; i < C; ++i)
                Dij[i] = Sarray();
            for (var i = 0; i < N; ++i)
                Cij[i] = Sarray();
            var info = Enumerable.Repeat(0, 3).Select(_ => new long[C]).ToArray();
            //それぞれのラインの色情報取得
            for (var i = 0; i < N; ++i)
                for (var j = 0; j < N; ++j)
                {
                    var n = (i + j) % 3;
                    ++info[n][Cij[i][j] - 1];
                }
            var cst = long.MaxValue;
            for (var c0 = 0; c0 < C; ++c0)
            {
                for (var c1 = 0; c1 < C; ++c1)
                {
                    if (c1 == c0) continue;
                    for (var c2 = 0; c2 < C; ++c2)
                    {
                        if (c2 == c1 || c2 == c0) continue;
                        var t = 0L;
                        //各グループをciに塗り替える
                        for (var i = 0; i < C; ++i)
                        {
                            t += info[0][i] * Dij[i][c0];
                            t += info[1][i] * Dij[i][c1];
                            t += info[2][i] * Dij[i][c2];
                        }
                        cst = Min(cst, t);
                    }
                }
            }
            WriteLine(cst);
        }
        static long MAX = long.MaxValue / 2;
        static long[] nums;
        static long dfs(long n)
        {
            if (n < 0) return MAX;
            if (MAX != nums[n]) return nums[n];
            var ret = MAX;
            var nv = 9;
            while (0 <= n - nv) nv *= 9;
            nv /= 9;
            while (nv != 1)
            {
                ret = Min(ret, dfs(n - nv));
                nv /= 9;
            }
            var sv = 6;
            while (0 <= n - sv) sv *= 6;
            nv /= 6;
            while (sv != 1)
            {
                ret = Min(ret, dfs(n - sv));
                sv /= 6;
            }

            ret = Min(ret, dfs(n - 1));
            return nums[n] = ret + 1;
        }

        static long Mod = 998244353;
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }
        static public (T1 a, T2 b) Slice<T1, T2>()
        {
            var t = ReadLine().Split();
            return (
            (T1)Convert.ChangeType(t[0], typeof(T1)),
            (T2)Convert.ChangeType(t[1], typeof(T2)));
        }
        static public (T a, T b) Slice2<T>()
        {
            var t = ReadLine().Split();
            return (
            (T)Convert.ChangeType(t[0], typeof(T)),
            (T)Convert.ChangeType(t[1], typeof(T)));
        }
        static public (T a, T b, T c) Slice3<T>()
        {
            var t = ReadLine().Split();
            return (
            (T)Convert.ChangeType(t[0], typeof(T)),
            (T)Convert.ChangeType(t[1], typeof(T)),
            (T)Convert.ChangeType(t[2], typeof(T)));
        }
    }
}

Measured memory_bytes: 42460