#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
using namespace std;


typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> pr;
typedef pair<LL, LL> lpr;
typedef pair<double, double> dbpr;
typedef pair<long double, long double> ldpr;
typedef double db;
typedef long double ld;

#define dbgs(x) #x << " = " << x
#define dbgs2(x, y) dbgs(x) << ", " << dbgs(y)
#define dbgs3(x, y, z) dbgs2(x, y) << ", " << dbgs(z)
#define dbgs4(w, x, y, z) dbgs3(w, x, y) << ", " << dbgs(z)

#define mst(s, x) memset(s, x, sizeof(s))
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define mp make_pair
#define all(x) x.begin(), x.end()
#define unq(x) x.erase(unique(x.begin(), x.end()), x.end())
#define fp(i, a, b) for (int i = (a), I = (b) + 1; i < I; ++i)
#define fd(i, a, b) for (int i = (a), I = (b)-1; i > I; --i)
#define ub upper_bound
#define lb lower_bound
#define bitcount __builtin_popcount
#define sqr(x) ((x)*(x))

#define go(u) for (int i = pre[u], v = e[i].v; i; i = e[i].next, v = e[i].v)
#define gow(u) for (LL i = pre[u], v = e[i].v, w = e[i].w; i; i = e[i].next, v = e[i].v, w = e[i].w)
#define EDGE(N,M) struct edge{int u,v,w,next;}e[M];int pre[N],edge_cnt=0;void addedge(int u,int v,int w=0){edge_cnt=edge_cnt+1,e[edge_cnt].u=u,e[edge_cnt].v=v,e[edge_cnt].w=w,e[edge_cnt].next=pre[u],pre[u]=edge_cnt;}
#define CLEAR_EDGE(N) {edge_cnt=0,memset(pre,0,sizeof(int)*(N+1));}

#define MC int _CASE;scanf("%d",&_CASE);fp(case_num,1,_CASE)

const int next_x[8] = {0, 1, -1, 0, 1, 1, -1, -1};
const int next_y[8] = {1, 0, 0, -1, 1, -1, -1, 1};
const int inf = 1e9+5;//7; 
const LL linf = 1e15;
const db  PI  = acos(-1.0);

const int MAXN  = 5000+5;
const int N     = 1e6+5;
const int M     = 1;
const ld eps    = 1e-8;

#define mid ((l+r)>>1)+
#define ls (cnt<<1)
#define rs (cnt<<1|1)

// #define ls ch[x][0]
// #define rs ch[x][1]

/*----------head----------*/

int n[3];
LL mn[3],s[3];
int main()
{
	fp(i,0,2)scanf("%d",&n[i]);
	fp(i,0,2)
	{
		mn[i]=linf;
		fp(j,1,n[i])
		{
			LL x;scanf("%lld",&x);
			s[i]+=x;
			mn[i]=min(mn[i],x);
		}
	}
	printf("%lld\n",max({
		+s[0]+s[1]-s[2],
		+s[0]-s[1]+s[2],
		-s[0]+s[1]+s[2],
		+s[0]+s[1]+s[2]-2*mn[0]-2*mn[1],
		+s[0]+s[1]+s[2]-2*mn[0]-2*mn[2],
		+s[0]+s[1]+s[2]-2*mn[1]-2*mn[2],
	}));
	return 0;
}

// 函数不返回值可能会 RE
// 少码大数据结构，想想复杂度更优的做法
// 小数 二分/三分 注意break条件
// 浮点运算 sqrt(a^2-b^2) 可用 sqrt(a+b)*sqrt(a-b) 代替，避免精度问题
// long double -> %Lf 别用C11 (C14/16)
// 控制位数 cout << setprecision(10) << ans;
// reverse vector 注意判空 不然会re
// 分块注意维护块上标记 来更新块内数组a[]
// vector+lower_bound常数 < map/set/(unordered_map)
// map.find不会创建新元素 map[]会 注意空间
// 别对指针用memset
// 用位运算表示2^n注意加LL 1LL<<20
// 注意递归爆栈
// 注意边界  
// 注意memset 多组会T

### Prompt

In CPP, your task is to solve the following problem:

You are given three bags. Each bag contains a non-empty multiset of numbers. You can perform a number of operations on these bags. In one operation, you can choose any two non-empty bags, and choose one number from each of the bags. Let's say that you choose number a from the first bag and number b from the second bag. Then, you remove b from the second bag and replace a with a-b in the first bag. Note that if there are multiple occurrences of these numbers, then you shall only remove/replace exactly one occurrence.

You have to perform these operations in such a way that you have exactly one number remaining in exactly one of the bags (the other two bags being empty). It can be shown that you can always apply these operations to receive such a configuration in the end. Among all these configurations, find the one which has the maximum number left in the end.

Input

The first line of the input contains three space-separated integers n_1, n_2 and n_3 (1 ≤ n_1, n_2, n_3 ≤ 3⋅10^5, 1 ≤ n_1+n_2+n_3 ≤ 3⋅10^5) — the number of numbers in the three bags.

The i-th of the next three lines contain n_i space-separated integers a_{{i,1}}, a_{{i,2}}, ..., a_{{i,{{n_i}}}} (1 ≤ a_{{i,j}} ≤ 10^9) — the numbers in the i-th bag.

Output

Print a single integer — the maximum number which you can achieve in the end.

Examples

Input


2 4 1
1 2
6 3 4 5
5


Output


20

Input


3 2 2
7 5 4
2 9
7 1


Output


29

Note

In the first example input, let us perform the following operations:

[1, 2], [6, 3, 4, 5], [5]

[-5, 2], [3, 4, 5], [5] (Applying an operation to (1, 6))

[-10, 2], [3, 4], [5] (Applying an operation to (-5, 5))

[2], [3, 4], [15] (Applying an operation to (5, -10))

[-1], [4], [15] (Applying an operation to (2, 3))

[-5], [], [15] (Applying an operation to (-1, 4))

[], [], [20] (Applying an operation to (15, -5))

You can verify that you cannot achieve a bigger number. Hence, the answer is 20.

### Response

```cpp
#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
using namespace std;


typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> pr;
typedef pair<LL, LL> lpr;
typedef pair<double, double> dbpr;
typedef pair<long double, long double> ldpr;
typedef double db;
typedef long double ld;

#define dbgs(x) #x << " = " << x
#define dbgs2(x, y) dbgs(x) << ", " << dbgs(y)
#define dbgs3(x, y, z) dbgs2(x, y) << ", " << dbgs(z)
#define dbgs4(w, x, y, z) dbgs3(w, x, y) << ", " << dbgs(z)

#define mst(s, x) memset(s, x, sizeof(s))
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define mp make_pair
#define all(x) x.begin(), x.end()
#define unq(x) x.erase(unique(x.begin(), x.end()), x.end())
#define fp(i, a, b) for (int i = (a), I = (b) + 1; i < I; ++i)
#define fd(i, a, b) for (int i = (a), I = (b)-1; i > I; --i)
#define ub upper_bound
#define lb lower_bound
#define bitcount __builtin_popcount
#define sqr(x) ((x)*(x))

#define go(u) for (int i = pre[u], v = e[i].v; i; i = e[i].next, v = e[i].v)
#define gow(u) for (LL i = pre[u], v = e[i].v, w = e[i].w; i; i = e[i].next, v = e[i].v, w = e[i].w)
#define EDGE(N,M) struct edge{int u,v,w,next;}e[M];int pre[N],edge_cnt=0;void addedge(int u,int v,int w=0){edge_cnt=edge_cnt+1,e[edge_cnt].u=u,e[edge_cnt].v=v,e[edge_cnt].w=w,e[edge_cnt].next=pre[u],pre[u]=edge_cnt;}
#define CLEAR_EDGE(N) {edge_cnt=0,memset(pre,0,sizeof(int)*(N+1));}

#define MC int _CASE;scanf("%d",&_CASE);fp(case_num,1,_CASE)

const int next_x[8] = {0, 1, -1, 0, 1, 1, -1, -1};
const int next_y[8] = {1, 0, 0, -1, 1, -1, -1, 1};
const int inf = 1e9+5;//7; 
const LL linf = 1e15;
const db  PI  = acos(-1.0);

const int MAXN  = 5000+5;
const int N     = 1e6+5;
const int M     = 1;
const ld eps    = 1e-8;

#define mid ((l+r)>>1)+
#define ls (cnt<<1)
#define rs (cnt<<1|1)

// #define ls ch[x][0]
// #define rs ch[x][1]

/*----------head----------*/

int n[3];
LL mn[3],s[3];
int main()
{
	fp(i,0,2)scanf("%d",&n[i]);
	fp(i,0,2)
	{
		mn[i]=linf;
		fp(j,1,n[i])
		{
			LL x;scanf("%lld",&x);
			s[i]+=x;
			mn[i]=min(mn[i],x);
		}
	}
	printf("%lld\n",max({
		+s[0]+s[1]-s[2],
		+s[0]-s[1]+s[2],
		-s[0]+s[1]+s[2],
		+s[0]+s[1]+s[2]-2*mn[0]-2*mn[1],
		+s[0]+s[1]+s[2]-2*mn[0]-2*mn[2],
		+s[0]+s[1]+s[2]-2*mn[1]-2*mn[2],
	}));
	return 0;
}

// 函数不返回值可能会 RE
// 少码大数据结构，想想复杂度更优的做法
// 小数 二分/三分 注意break条件
// 浮点运算 sqrt(a^2-b^2) 可用 sqrt(a+b)*sqrt(a-b) 代替，避免精度问题
// long double -> %Lf 别用C11 (C14/16)
// 控制位数 cout << setprecision(10) << ans;
// reverse vector 注意判空 不然会re
// 分块注意维护块上标记 来更新块内数组a[]
// vector+lower_bound常数 < map/set/(unordered_map)
// map.find不会创建新元素 map[]会 注意空间
// 别对指针用memset
// 用位运算表示2^n注意加LL 1LL<<20
// 注意递归爆栈
// 注意边界  
// 注意memset 多组会T

```