// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;

#define INF 1<<30

#define endl '\n'

#define maxn 1000005

#define FASTIO ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);

typedef long long ll;

const double PI = acos(-1.0);

const ll mod = 1e9 + 7;



inline void normal(ll &a) { a %= mod; (a < 0) && (a += mod); }

inline ll modMul(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a * b) % mod; }

inline ll modAdd(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a + b) % mod; }

inline ll modSub(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); a -= b; normal(a); return a; }

inline ll modPow(ll b, ll p) { ll r = 1; while (p) { if (p & 1) r = modMul(r, b); b = modMul(b, b); p >>= 1; } return r; }

inline ll modInverse(ll a) { return modPow(a, mod - 2); }

inline ll modDiv(ll a, ll b) { return modMul(a, modInverse(b)); }





///**

template < typename F, typename S >

ostream& operator << ( ostream& os, const pair< F, S > & p ) {

	return os << "(" << p.first << ", " << p.second << ")";

}



template < typename T >

ostream &operator << ( ostream & os, const vector< T > &v ) {

	os << "{";

	for (auto it = v.begin(); it != v.end(); ++it) {

		if ( it != v.begin() ) os << ", ";

		os << *it;

	}

	return os << "}";

}



template < typename T >

ostream &operator << ( ostream & os, const set< T > &v ) {

	os << "[";

	for (auto it = v.begin(); it != v.end(); ++it) {

		if ( it != v.begin()) os << ", ";

		os << *it;

	}

	return os << "]";

}



template < typename F, typename S >

ostream &operator << ( ostream & os, const map< F, S > &v ) {

	os << "[";

	for (auto it = v.begin(); it != v.end(); ++it) {

		if ( it != v.begin() ) os << ", ";

		os << it -> first << " = " << it -> second ;

	}

	return os << "]";

}



#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)



clock_t tStart = clock();

#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)



void faltu () { cerr << endl; }



template <typename T>

void faltu( T a[], int n ) {

	for (int i = 0; i < n; ++i) cerr << a[i] << ' ';

	cerr << endl;

}



template <typename T, typename ... hello>

void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

// Program showing a policy-based data structure.

#include <ext/pb_ds/assoc_container.hpp> // Common file 

#include <ext/pb_ds/tree_policy.hpp>

#include <functional> // for less 

#include <iostream>

using namespace __gnu_pbds;

using namespace std;

// GNU link : https://goo.gl/WVDL6g

typedef tree<int, null_type, less_equal<int>, rb_tree_tag,

        tree_order_statistics_node_update>

        new_data_set;



// find_by_order(k) – ফাংশনটি kth ordered element এর একটা পয়েন্টার রিটার্ন করে। অর্থাৎ তুমি চাইলেই kth ইন্ডেক্সে কি আছে, সেটা জেনে ফেলতে পারছো!

// order_of_key(x) – ফাংশনটি x এলিমেন্টটা কোন পজিশনে আছে সেটা বলে দেয়।



/**___________________________________________________**/



const int N = 20000;

bitset<N * 2> dp[80][80];



int main()

{

	FASTIO

	/*

#ifndef ONLINE_JUDGE

	freopen("in.txt", "r", stdin);

	freopen("out.txt", "w", stdout);

	freopen("error.txt", "w", stderr);

#endif

//*/

	int n, m;

	cin >> n >> m;

	vector<vector<int> > a(n, vector<int>(m));

	for (int i = 0; i < n; i++)

		for (int j = 0; j < m; j++) cin >> a[i][j];



	vector<vector<int> > b(n, vector<int>(m));

	for (int i = 0; i < n; i++)

		for (int j = 0; j < m; j++) cin >> b[i][j];



	dp[0][0][N + a[0][0] - b[0][0]] = true;

	dp[0][0][N - a[0][0] + b[0][0]] = true;



	for (int i = 0; i < n; i++)

		for (int j = 0; j < m; j++)

			for (int k = 0; k < 2 * N; k++)

				if (dp[i][j][k]) {

					if (i + 1 < n) {

						dp[i + 1][j][k + a[i + 1][j] - b[i + 1][j]] = true;

						dp[i + 1][j][k - a[i + 1][j] + b[i + 1][j]] = true;

					}

					if (j + 1 < m) {

						dp[i][j + 1][k + a[i][j + 1] - b[i][j + 1]] = true;

						dp[i][j + 1][k - a[i][j + 1] + b[i][j + 1]] = true;

					}

				}



	int ans = 1e9;

	for (int k = 0; k < 2 * N; k++)

		if (dp[n - 1][m - 1][k]) {

			ans = min(ans, abs(N - k));

		}

	cout << ans << endl;



	return 0;

}

// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;

#define INF 1<<30

#define endl '\n'

#define maxn 1000005

#define FASTIO ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);

typedef long long ll;

const double PI = acos(-1.0);

const ll mod = 1e9 + 7;



inline void normal(ll &a) { a %= mod; (a < 0) && (a += mod); }

inline ll modMul(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a * b) % mod; }

inline ll modAdd(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a + b) % mod; }

inline ll modSub(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); a -= b; normal(a); return a; }

inline ll modPow(ll b, ll p) { ll r = 1; while (p) { if (p & 1) r = modMul(r, b); b = modMul(b, b); p >>= 1; } return r; }

inline ll modInverse(ll a) { return modPow(a, mod - 2); }

inline ll modDiv(ll a, ll b) { return modMul(a, modInverse(b)); }





///**

template < typename F, typename S >

ostream& operator << ( ostream& os, const pair< F, S > & p ) {

	return os << "(" << p.first << ", " << p.second << ")";

}



template < typename T >

ostream &operator << ( ostream & os, const vector< T > &v ) {

	os << "{";

	for (auto it = v.begin(); it != v.end(); ++it) {

		if ( it != v.begin() ) os << ", ";

		os << *it;

	}

	return os << "}";

}



template < typename T >

ostream &operator << ( ostream & os, const set< T > &v ) {

	os << "[";

	for (auto it = v.begin(); it != v.end(); ++it) {

		if ( it != v.begin()) os << ", ";

		os << *it;

	}

	return os << "]";

}



template < typename F, typename S >

ostream &operator << ( ostream & os, const map< F, S > &v ) {

	os << "[";

	for (auto it = v.begin(); it != v.end(); ++it) {

		if ( it != v.begin() ) os << ", ";

		os << it -> first << " = " << it -> second ;

	}

	return os << "]";

}



#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)



clock_t tStart = clock();

#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)



void faltu () { cerr << endl; }



template <typename T>

void faltu( T a[], int n ) {

	for (int i = 0; i < n; ++i) cerr << a[i] << ' ';

	cerr << endl;

}



template <typename T, typename ... hello>

void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

// Program showing a policy-based data structure.

#include <ext/pb_ds/assoc_container.hpp> // Common file 

#include <ext/pb_ds/tree_policy.hpp>

#include <functional> // for less 

#include <iostream>

using namespace __gnu_pbds;

using namespace std;

// GNU link : https://goo.gl/WVDL6g

typedef tree<int, null_type, less_equal<int>, rb_tree_tag,

        tree_order_statistics_node_update>

        new_data_set;



// find_by_order(k) – ফাংশনটি kth ordered element এর একটা পয়েন্টার রিটার্ন করে। অর্থাৎ তুমি চাইলেই kth ইন্ডেক্সে কি আছে, সেটা জেনে ফেলতে পারছো!

// order_of_key(x) – ফাংশনটি x এলিমেন্টটা কোন পজিশনে আছে সেটা বলে দেয়।



/**___________________________________________________**/



const int N = 20000;

bitset<N * 2> dp[85][85];



int main()

{

	FASTIO

	/*

#ifndef ONLINE_JUDGE

	freopen("in.txt", "r", stdin);

	freopen("out.txt", "w", stdout);

	freopen("error.txt", "w", stderr);

#endif

//*/

	int n, m;

	cin >> n >> m;

	vector<vector<int> > a(n, vector<int>(m));

	for (int i = 0; i < n; i++)

		for (int j = 0; j < m; j++) cin >> a[i][j];



	vector<vector<int> > b(n, vector<int>(m));

	for (int i = 0; i < n; i++)

		for (int j = 0; j < m; j++) cin >> b[i][j];



	dp[0][0][N] = 1;

	for (int i = 0; i < n; i++) {

		for (int j = 0; j < m; j++) {

			int dif = abs(a[i][j] - b[i][j]);

			dp[i][j] = (dp[i][j] << dif) | (dp[i][j] >> dif);



			dp[i + 1][j] |= dp[i][j];

			dp[i][j + 1] |= dp[i][j];

		}

	}



	int ans = 1e9;

	for (int k = 0; k < 2 * N; k++)

		if (dp[n - 1][m - 1][k]) {

			ans = min(ans, abs(N - k));

		}

	cout << ans << endl;



	return 0;

}

// Fastest known solution for this problem: