#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

#define each(i,a) for (auto&& i : a)
#define FOR(i,a,b) for (ll i=(a),__last_##i=(b);i<__last_##i;i++)
#define RFOR(i,a,b) for (ll i=(b)-1,__last_##i=(a);i>=__last_##i;i--)
#define REP(i,n) FOR(i,0,n)
#define RREP(i,n) RFOR(i,0,n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define all(a) (a).begin(),(a).end()
#define chmin(x,v) x = min(x, v)
#define chmax(x,v) x = max(x, v)

const ll linf = 1e18;
const int inf = 1e9;
const double eps = 1e-12;
const double pi = acos(-1);

template<typename T>
istream& operator>>(istream& is, vector<T>& vec) {
    each(x,vec) is >> x;
    return is;
}
template<typename T>
ostream& operator<<(ostream& os, const vector<T>& vec) {
    rep(i,vec.size()) {
        if (i) os << " ";
        os << vec[i];
    }
    return os;
}
template<typename T>
ostream& operator<<(ostream& os, const vector< vector<T> >& vec) {
    rep(i,vec.size()) {
        if (i) os << endl;
        os << vec[i];
    }
    return os;
}

ll n, m;
vector<ll> a, b;
vector<ll> A, B;
bool m1[51][51][51][51][2][2] = {0};
ll m2[51][51][51][51][2][2];
ll f(ll l1, ll r1, ll l2, ll r2) {
	return (A[l1] - A[r1]) - (B[l2] - B[r2]);
}
ll dp(ll l1, ll r1, ll l2, ll r2, bool is_first, bool is_skipped) {
	const ll sgn = is_first ? 1 : -1;
	ll res = -linf;
	if (m1[l1][r1][l2][r2][is_first][is_skipped]) {
		return m2[l1][r1][l2][r2][is_first][is_skipped];
	}
	if (is_skipped && l1 == r1 && l2 == r2) chmax(res, 0LL);
	else {
		chmax(res, sgn * (f(l1, r1, l2, r2) + dp(r1, r1, r2, r2, !is_first, l1 == r1 && l2 == r2)));
	}
	if (is_first) {
		if (r1 < n) {
			if (a[r1] < 0) {
				chmax(res, sgn * dp(l1, r1+1, r2, r2, !is_first, false));
			}
			else {
				chmax(res, sgn * dp(l1, r1+1, l2, r2, !is_first, false));
			}
		}
	}
	else {
		if (r2 < m) {
			if (b[r2] < 0) {
				chmax(res, sgn * dp(r1, r1, l2, r2+1, !is_first, false));
			}
			else {
				chmax(res, sgn * dp(l1, r1, l2, r2+1, !is_first, false));
			}
		}
	}
	m1[l1][r1][l2][r2][is_first][is_skipped] = true;
	return m2[l1][r1][l2][r2][is_first][is_skipped] = sgn * res;
}
void S(vector<ll>& X, const vector<ll>& x) {
	X.assign(x.size()+1, 0);
	rrep(i, x.size()) {
		X[i] = X[i+1] + max(x[i], 0LL);
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
	a.resize(n); cin >> a;
	b.resize(m); cin >> b;
	S(A, a);
	S(B, b);
	cout << dp(0, 0, 0, 0, true, false) << endl;
}