#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define SPEED ios_base::sync_with_stdio(false); cin.tie(NULL);
#define FOR(i, a, b) for (ll i = a; i < b; ++i)
#define RFOR(i, b, a) for (ll i = b; i >= a; --i)
#define ALL(x) x.begin(), x.end()
#define DEBUG(args...) { string _s = #args; replace(ALL(_s), ' ', '\0');\
replace(ALL(_s), ',', ' ');\
stringstream _ss(_s); istream_iterator<string> _it(_ss); _debug(_it, args);}
#define endl "\n"
#define F first
#define S second
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)

using namespace std;
using namespace __gnu_pbds;

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

void _debug(istream_iterator<string>) {}
template<typename T, typename... Args>
void _debug(istream_iterator<string> it, T first, Args... args) {
    cerr << ">> " << *it << " : " << first << endl; _debug(++it, args...);
}
template <typename T1, typename T2>
inline ostream& operator << (ostream& out, const pair<T1, T2>& p) {
    return out << "(" << p.F << ", " << p.S << ")";
}
template<typename T>
inline ostream& operator << (ostream& out, const vector<T>& v) {
    if (v.empty()) return out << "[]";
    else { out << '['; for (auto& e : v) { out << e << ", "; } return out << "\b\b]"; }
}
template<typename T>
inline ostream& operator << (ostream& out, const set<T>& s) {
    if (s.empty()) return out << "{}";
    else { out << '{'; for (auto& e : s) { out << e << ", "; } return out << "\b\b}"; }
}
template<typename T>
inline ostream& operator << (ostream& out, const unordered_set<T>& s) {
    return out << set<T>(ALL(s));
}
template<typename T1, typename T2>
inline ostream& operator << (ostream& out, const map<T1, T2>& m) {
    if (m.empty()) return out << "{}";
    out << '{'; for (auto& p : m) { out << p << ", "; } return out << "\b\b}";
}
template<typename T1, typename T2>
inline ostream& operator << (ostream& out, const unordered_map<T1, T2>& m) {
    return out << map<T1, T2>(ALL(m));
}
template<typename T>
inline ostream& operator << (ostream& out, const ordered_set<T>& s) {
    return out << set<T>(ALL(s));
}

typedef long long ll;
typedef long double ld;
typedef vector<long long> vll;
typedef pair<ll, ll> pll;
typedef vector<pair<ll, ll>> vpll;
typedef unordered_map<ll, ll> STll;
/************************************** MAIN PROGRAM ********************************************/
const int MAX = 81;
int grid[MAX][MAX];
const int T_MAX = 2 * MAX * MAX;
bool dp[MAX][MAX][2 * T_MAX];
int h, w;

//bool ans(int r, int c, int diff) {
//    // DEBUG(r, c, diff)
//    if ((r == h && c == w - 1) || (r == h - 1 && c == w)) {
//        //    DEBUG(diff)
//        return diff == 0;
//    }
//    if (!(r < h && c < w && r >= 0 && c >= 0)) return false;
//    if (cache[r][c][diff + T_MAX] != -1) return cache[r][c][diff + T_MAX];
//
//
//
//    return (cache[r][c][diff + T_MAX] = down | right);
//}

int main()
{
   // freopen("input.txt", "r", stdin);
    SPEED

//    memset(cache, -1, sizeof cache);
    cin >> h >> w;
    FOR(i, 0, h) {
        FOR(j, 0, w) {
            cin >> grid[i][j];
        }
    }
    FOR(i, 0, h) {
        FOR(j, 0, w) {
            int x;
            cin >> x;
            grid[i][j] -= x;
            grid[i][j] = abs(grid[i][j]);
         //   cout << grid[i][j] << ' ';
        }
       // cout << endl;
    }
   // DEBUG(ans(1, 2, 5))

    dp[h][w - 1][0 + T_MAX] = dp[h - 1][w][0 + T_MAX] = true;
    RFOR(r, h - 1, 0) {
        RFOR(c, w - 1, 0) {
            FOR(diff, -T_MAX + 1, T_MAX) {
                int sub = diff - grid[r][c];
                int add = diff + grid[r][c];
                bool down = dp[r + 1][c][sub + T_MAX] | dp[r + 1][c][T_MAX + add];
                bool right = dp[r][c + 1][add + T_MAX] | dp[r][c + 1][T_MAX + sub];

                dp[r][c][diff + T_MAX] = down | right;
            }
        }
    }
    FOR(i, 0, T_MAX) {
        if (dp[0][0][i + T_MAX]) {
            cout << i;
            return 0;
        }
    }
}
/************************************** END OF PROGRAM ******************************************/
/** Stuff you should look for:
 * int overflow, array bounds, over-counting, graph is not a tree/connected
 * special cases (n=1?), set/unordered_set TLE, multi-set/set error
 * do something instead of nothing and stay organized
 */


Measured memory_bytes: 168192