// Slower C++ solution:
#include <cassert>

#include <cctype>

#include <cerrno>

#include <cfloat>

#include <ciso646>

#include <climits>

#include <clocale>

#include <cmath>

#include <csetjmp>

#include <csignal>

#include <cstdarg>

#include <cstddef>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <ctime>

#include <cwchar>

#include <cwctype>

#include <ccomplex>

#include <cfenv>

#include <cinttypes>

#include <cstdbool>

#include <cstdint>

#include <ctgmath>

#include <algorithm>

#include <bitset>

#include <complex>

#include <deque>

#include <exception>

#include <fstream>

#include <functional>

#include <iomanip>

#include <ios>

#include <iosfwd>

#include <iostream>

#include <istream>

#include <iterator>

#include <limits>

#include <list>

#include <locale>

#include <map>

#include <memory>

#include <new>

#include <numeric>

#include <ostream>

#include <queue>

#include <set>

#include <sstream>

#include <stack>

#include <stdexcept>

#include <streambuf>

#include <string>

#include <typeinfo>

#include <utility>

#include <valarray>

#include <vector>

#include <array>

#include <atomic>

#include <chrono>

#include <codecvt>

#include <condition_variable>

#include <forward_list>

#include <future>

#include <initializer_list>

#include <mutex>

#include <random>

#include <ratio>

#include <regex>

#include <scoped_allocator>

#include <system_error>

#include <thread>

#include <tuple>

#include <typeindex>

#include <type_traits>

#include <unordered_map>

#include <unordered_set>

#define rep(i, n) for(ll i = 0; i < (ll)(n); i++)

#define rep2(i, n) for(int i = 1; i <= (int)(n); i++)

#define all(x) (x).begin(),(x).end()

using namespace std;

typedef int64_t ll;

typedef long double ld;

const ll INF=(1LL<<62);

const double inf=pow(10,10);

const ld pi=acosl(1);

const ll mod = 1000000007;

const int dx[4]={0,1,0,-1};

const int dy[4]={1,0,-1,0};

const int ddx[8]={1,0,-1,-1,-1,0,1,1};

const int ddy[8]={1,1,1,0,-1,-1,-1,0};



long long gcd(long long a,long long b){

	if(a<b)swap(a,b);

	if(a%b==0)return b;

	else return gcd(a%b,b);

}



long long lcm(long long a,long long b){

	return a*b/gcd(a,b);

}

template< int mod >

struct ModInt {

  int x;



  ModInt() : x(0) {}



  ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}



  ModInt &operator+=(const ModInt &p) {

    if((x += p.x) >= mod) x -= mod;

    return *this;

  }



  ModInt &operator-=(const ModInt &p) {

    if((x += mod - p.x) >= mod) x -= mod;

    return *this;

  }



  ModInt &operator*=(const ModInt &p) {

    x = (int) (1LL * x * p.x % mod);

    return *this;

  }



  ModInt &operator/=(const ModInt &p) {

    *this *= p.inverse();

    return *this;

  }



  ModInt operator-() const { return ModInt(-x); }



  ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }



  ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }



  ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }



  ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }



  bool operator==(const ModInt &p) const { return x == p.x; }



  bool operator!=(const ModInt &p) const { return x != p.x; }



  ModInt inverse() const {

    int a = x, b = mod, u = 1, v = 0, t;

    while(b > 0) {

      t = a / b;

      swap(a -= t * b, b);

      swap(u -= t * v, v);

    }

    return ModInt(u);

  }



  ModInt pow(int64_t n) const {

    ModInt ret(1), mul(x);

    while(n > 0) {

      if(n & 1) ret *= mul;

      mul *= mul;

      n >>= 1;

    }

    return ret;

  }



  friend ostream &operator<<(ostream &os, const ModInt &p) {

    return os << p.x;

  }



  friend istream &operator>>(istream &is, ModInt &a) {

    int64_t t;

    is >> t;

    a = ModInt< mod >(t);

    return (is);

  }



  static int get_mod() { return mod; }

};



using modint = ModInt< mod >;



template< typename T >

T binomial(int64_t N, int64_t K) {

  if(K < 0 || N < K) return 0;

  T ret = 1;

  for(ll i = 1; i <= K; ++i) {

    ret *= N--;

    ret /= i;

  }

  return ret;

}



template< typename T >

struct Combination {

  vector< T > _fact, _rfact, _inv;



  Combination(int sz) : _fact(sz + 1), _rfact(sz + 1), _inv(sz + 1) {

    _fact[0] = _rfact[sz] = _inv[0] = 1;

    for(int i = 1; i <= sz; i++) _fact[i] = _fact[i - 1] * i;

    _rfact[sz] /= _fact[sz];

    for(int i = sz - 1; i >= 0; i--) _rfact[i] = _rfact[i + 1] * (i + 1);

    for(int i = 1; i <= sz; i++) _inv[i] = _rfact[i] * _fact[i - 1];

  }



  inline T fact(int k) const { return _fact[k]; }



  inline T rfact(int k) const { return _rfact[k]; }



  inline T inv(int k) const { return _inv[k]; }



  T P(int n, int r) const {

    if(r < 0 || n < r) return 0;

    return fact(n) * rfact(n - r);

  }



  T C(int p, int q) const {

    if(q < 0 || p < q) return 0;

    return fact(p) * rfact(q) * rfact(p - q);

  }



  T H(int n, int r) const {

    if(n < 0 || r < 0) return (0);

    return r == 0 ? 1 : C(n + r - 1, r);

  }

};



struct Edge{

	ll a;

	ll b;

	ll color;

	Edge(ll _a,ll _b,ll _color):a(_a),b(_b),color(_color){}

	void show(){

		cout<<"a"<<a<<" b"<<b<<" color"<<color<<endl;

	}

};



int main(){

	ll h,w;cin>>h>>w;

	ll a[h][w];

	ll b[h][w];

	ll A[h][w];

	rep(i,h)rep(j,w)cin>>a[i][j];

	rep(i,h)rep(j,w)cin>>b[i][j];

	rep(i,h)rep(j,w)A[i][j]=a[i][j]-b[i][j];

	

	const ll base=15000;

	vector<vector<bitset<30000>>>dp(h+1,vector<bitset<30000>>(w+1));

	dp[0][1][base]=true;

	dp[1][0][base]=true;

	

	rep(i,h)rep(j,w)rep(k,2*base){

		if(0<=k+A[i][j]&&k+A[i][j]<2*base){

			if(dp[i+1][j][k+A[i][j]])dp[i+1][j+1][k]=true;

		}

		if(0<=k-A[i][j]&&k-A[i][j]<2*base){

			if(dp[i+1][j][k-A[i][j]])dp[i+1][j+1][k]=true;

		}

		

		if(0<=k+A[i][j]&&k+A[i][j]<2*base){

			if(dp[i][j+1][k+A[i][j]])dp[i+1][j+1][k]=true;

		}

		if(0<=k-A[i][j]&&k-A[i][j]<2*base){

			if(dp[i][j+1][k-A[i][j]])dp[i+1][j+1][k]=true;

		}

	}

	ll ans=INF;

	//cout<<"s"<<endl;

	rep(k,2*base){

		if(dp[h][w][k])ans=min(ans,abs(k-base));

		//if(dp[h][w][k])cout<<k<<" "<<k-base<<endl;

	}

	cout<<ans<<endl;

}


// Faster C++ solution for the same problem (measured speedup: 1.6750690982537264x):
#include <cassert>

#include <cctype>

#include <cerrno>

#include <cfloat>

#include <ciso646>

#include <climits>

#include <clocale>

#include <cmath>

#include <csetjmp>

#include <csignal>

#include <cstdarg>

#include <cstddef>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <ctime>

#include <cwchar>

#include <cwctype>

#include <ccomplex>

#include <cfenv>

#include <cinttypes>

#include <cstdbool>

#include <cstdint>

#include <ctgmath>

#include <algorithm>

#include <bitset>

#include <complex>

#include <deque>

#include <exception>

#include <fstream>

#include <functional>

#include <iomanip>

#include <ios>

#include <iosfwd>

#include <iostream>

#include <istream>

#include <iterator>

#include <limits>

#include <list>

#include <locale>

#include <map>

#include <memory>

#include <new>

#include <numeric>

#include <ostream>

#include <queue>

#include <set>

#include <sstream>

#include <stack>

#include <stdexcept>

#include <streambuf>

#include <string>

#include <typeinfo>

#include <utility>

#include <valarray>

#include <vector>

#include <array>

#include <atomic>

#include <chrono>

#include <codecvt>

#include <condition_variable>

#include <forward_list>

#include <future>

#include <initializer_list>

#include <mutex>

#include <random>

#include <ratio>

#include <regex>

#include <scoped_allocator>

#include <system_error>

#include <thread>

#include <tuple>

#include <typeindex>

#include <type_traits>

#include <unordered_map>

#include <unordered_set>

#define rep(i, n) for(ll i = 0; i < (ll)(n); i++)

#define rep2(i, n) for(int i = 1; i <= (int)(n); i++)

#define all(x) (x).begin(),(x).end()

using namespace std;

typedef int64_t ll;

typedef long double ld;

const ll INF=(1LL<<62);

const double inf=pow(10,10);

const ld pi=acosl(1);

const ll mod = 1000000007;

const int dx[4]={0,1,0,-1};

const int dy[4]={1,0,-1,0};

const int ddx[8]={1,0,-1,-1,-1,0,1,1};

const int ddy[8]={1,1,1,0,-1,-1,-1,0};



long long gcd(long long a,long long b){

	if(a<b)swap(a,b);

	if(a%b==0)return b;

	else return gcd(a%b,b);

}



long long lcm(long long a,long long b){

	return a*b/gcd(a,b);

}

template< int mod >

struct ModInt {

  int x;



  ModInt() : x(0) {}



  ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}



  ModInt &operator+=(const ModInt &p) {

    if((x += p.x) >= mod) x -= mod;

    return *this;

  }



  ModInt &operator-=(const ModInt &p) {

    if((x += mod - p.x) >= mod) x -= mod;

    return *this;

  }



  ModInt &operator*=(const ModInt &p) {

    x = (int) (1LL * x * p.x % mod);

    return *this;

  }



  ModInt &operator/=(const ModInt &p) {

    *this *= p.inverse();

    return *this;

  }



  ModInt operator-() const { return ModInt(-x); }



  ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }



  ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }



  ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }



  ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }



  bool operator==(const ModInt &p) const { return x == p.x; }



  bool operator!=(const ModInt &p) const { return x != p.x; }



  ModInt inverse() const {

    int a = x, b = mod, u = 1, v = 0, t;

    while(b > 0) {

      t = a / b;

      swap(a -= t * b, b);

      swap(u -= t * v, v);

    }

    return ModInt(u);

  }



  ModInt pow(int64_t n) const {

    ModInt ret(1), mul(x);

    while(n > 0) {

      if(n & 1) ret *= mul;

      mul *= mul;

      n >>= 1;

    }

    return ret;

  }



  friend ostream &operator<<(ostream &os, const ModInt &p) {

    return os << p.x;

  }



  friend istream &operator>>(istream &is, ModInt &a) {

    int64_t t;

    is >> t;

    a = ModInt< mod >(t);

    return (is);

  }



  static int get_mod() { return mod; }

};



using modint = ModInt< mod >;



template< typename T >

T binomial(int64_t N, int64_t K) {

  if(K < 0 || N < K) return 0;

  T ret = 1;

  for(ll i = 1; i <= K; ++i) {

    ret *= N--;

    ret /= i;

  }

  return ret;

}



template< typename T >

struct Combination {

  vector< T > _fact, _rfact, _inv;



  Combination(int sz) : _fact(sz + 1), _rfact(sz + 1), _inv(sz + 1) {

    _fact[0] = _rfact[sz] = _inv[0] = 1;

    for(int i = 1; i <= sz; i++) _fact[i] = _fact[i - 1] * i;

    _rfact[sz] /= _fact[sz];

    for(int i = sz - 1; i >= 0; i--) _rfact[i] = _rfact[i + 1] * (i + 1);

    for(int i = 1; i <= sz; i++) _inv[i] = _rfact[i] * _fact[i - 1];

  }



  inline T fact(int k) const { return _fact[k]; }



  inline T rfact(int k) const { return _rfact[k]; }



  inline T inv(int k) const { return _inv[k]; }



  T P(int n, int r) const {

    if(r < 0 || n < r) return 0;

    return fact(n) * rfact(n - r);

  }



  T C(int p, int q) const {

    if(q < 0 || p < q) return 0;

    return fact(p) * rfact(q) * rfact(p - q);

  }



  T H(int n, int r) const {

    if(n < 0 || r < 0) return (0);

    return r == 0 ? 1 : C(n + r - 1, r);

  }

};



struct Edge{

	ll a;

	ll b;

	ll color;

	Edge(ll _a,ll _b,ll _color):a(_a),b(_b),color(_color){}

	void show(){

		cout<<"a"<<a<<" b"<<b<<" color"<<color<<endl;

	}

};



int main(){

	ll h,w;cin>>h>>w;

	ll a[h][w];

	ll b[h][w];

	ll A[h][w];

	rep(i,h)rep(j,w)cin>>a[i][j];

	rep(i,h)rep(j,w)cin>>b[i][j];

	rep(i,h)rep(j,w)A[i][j]=abs(a[i][j]-b[i][j]);

	

	const ll base=15000;

	vector<vector<bitset<30000>>>dp(h+1,vector<bitset<30000>>(w+1));

	dp[0][1].set(base);

	dp[1][0].set(base);

	

	rep(i,h)rep(j,w){

		dp[i+1][j+1]|=(dp[i+1][j]<<A[i][j]);

		dp[i+1][j+1]|=(dp[i][j+1]<<A[i][j]);

		dp[i+1][j+1]|=(dp[i+1][j]>>A[i][j]);

		dp[i+1][j+1]|=(dp[i][j+1]>>A[i][j]);

	}

	ll ans=INF;

	rep(k,2*base){

		if(dp[h][w][k])ans=min(ans,abs(k-base));

	}

	//cout<<dp[h][w]<<endl;

	cout<<ans<<endl;

}