using System;
using System.Collections.Generic;
using System.Linq;
using static Input;
using NX = System.Int64;
public class Prog
{
    public static void Solve()
    {
        int H = NextInt(), W = NextInt();
        List<int[]> A = Enumerable.Range(0, H).Select(v => LineInt()).ToList();
        List<int[]> B = Enumerable.Range(0, H).Select(v => LineInt()).ToList();
        List<int[]> C = Enumerable.Range(0, H).Select(v => new int[W]).ToList();
        for (int i = 0; i < H; i++)
            for (int j = 0; j < W; j++) C[i][j] = Math.Abs(A[i][j] - B[i][j]);

        bool[,,] dp = new bool[H, W, 13000];
        for (int i = 0; i < H; i++)
            for (int j = 0; j < W; j++)
                for (int k = 0; k < 13000; k++) dp[i, j, k] = false;
        dp[0, 0, C[0][0]] = true;
        Queue<Tuple<int, int>> Q = new Queue<Tuple<int, int>>();
        for (int i = 0; i < 159; i++)
        {
            //i : 手数
            for (int y = 0; y < 80; y++)
            {
                int x = i - y;
                if (x < 0) break;
                Q.Enqueue(new Tuple<int, int>(y, x));
            }
        }
        while (Q.Count() != 0)
        {
            //現状態から周り見る感じで
            var xy = Q.Dequeue();
            int x = xy.Item1, y = xy.Item2;
            if (x < 0 || W <= x || y < 0 || H <= y) continue;
            //x-1 or y-1 の状態から加算減算から考える
            for (int z = 0; z < (80 * (x + y + 1)); z++)
            {
                if (y != 0 && dp[y - 1, x, z])
                {
                    dp[y, x, z + C[y][x]] = true;
                    dp[y, x, Math.Abs(z - C[y][x])] = true;
                }
                if (x != 0 && dp[y, x - 1, z])
                {
                    dp[y, x, z + C[y][x]] = true;
                    dp[y, x, Math.Abs(z - C[y][x])] = true;
                }
            }
        }
        int ans = INF;
        for (int i = 0; i < 13000; i++)
            if (dp[H - 1, W - 1, i]) { ans = i; break; }
        Console.WriteLine(ans);

    }
    public static void Main()
    {
        var sw = new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
        Console.SetOut(sw);
        Solve();
        Console.Out.Flush();
        return;
    }
}
public class Input
{
    public const long MOD = 1000000007;
    public const int INF = 1000000007;
    private static Queue<string> q = new Queue<string>();
    private static void Confirm() { if (q.Count == 0) foreach (var s in Console.ReadLine().Split(' ')) q.Enqueue(s); }
    public static int NextInt() { Confirm(); return int.Parse(q.Dequeue()); }
    public static long NextLong() { Confirm(); return long.Parse(q.Dequeue()); }
    public static string NextString() { Confirm(); return q.Dequeue(); }
    public static double NextDouble() { Confirm(); return double.Parse(q.Dequeue()); }
    public static int[] LineInt() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
    public static long[] LineLong() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
    public static string[] LineString() { return Console.ReadLine().Split(' ').ToArray(); }
    public static double[] LineDouble() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
    public long Abs(long a, long b) => Math.Abs(a - b);
}


Measured memory_bytes: 95064