#include<bits/stdc++.h>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define int long long 
#define pb push_back
#define ins insert
#define rs resize
#define br break;
#define cont continue;
#define vi vector<int>
#define vll vector<long long>
#define si set<ll>
#define sll set<long long>
#define pii pair<ll,ll>
#define pll pair<long long, long long>
#define speed ios_base::sync_with_stdio(false);cin.tie(NULL);
#define vec vector
#define cend cout<<endl;
#define sc second
#define fr first
#define retz return 0;
#define ll_MAX (ll)(1e9*1e9)
#define ll_MIN (ll)(-1e9*1e9)
#define lb lower_bound
#define ub upper_bound
#define rep(i,a,b)  for(int i=a; i<=b; i++)
#define repd(i,a,b) for(int i=a; i>=b; i--)
#define ps(arr, n) for(int i=1; i<n; i++)arr[i]+=arr[i-1];
#define inp(arr, n)for(int i=0; i<n; i++)cin>>arr[i];
#define out(arr, n)for(int i=0; i<n; i++)cout<<arr[i];
#define inp1(arr,n,m)for(int i=0; i<n; i++)for(int j=0;j<m;j++)cin>>arr[i][j];
#define out1(arr,n,m)for(int i=0; i<n; i++)for(int j=0;j<m;j++)cin>>arr[i][j];
#define loop(q) for(auto it:q)
#define loop1(q) for(auto&it:q)
#define db1 cout << "*" << endl
#define db2 cout << "YES" << endl
using namespace std;
using namespace __gnu_pbds; 
#define oset(X) tree<X,null_type,less<X>, rb_tree_tag, tree_order_statistics_node_update> 
#define roset(X) tree<X,null_type,greater<X>, rb_tree_tag, tree_order_statistics_node_update>  
#define okey order_of_key //lower_bound_set
#define ofind find_by_order
#define cyes cout << "Yes" << endl; 
#define cno cout << "No" << endl;
#define mod (long long)1000000007
#define mod2 998244353
#define INT_MAX1 900000000
#define MAXN 2000000
#define INF INT_MAX





void solve()
{
  int x, y;
  cin >> x >> y;
  int a, b, c;
  cin >> a >> b >> c;
  multiset<int> p, q, r;
  rep(i,0,a-1)
  {
    int x;
    cin >> x;
    p.insert(x);
  }
  rep(i,0,b-1)
  {
    int x;
    cin >> x;
    q.insert(x);
  }
  
  while(p.size()>x)
  {
    p.erase(p.begin());
  }
  while(q.size()>y)
  {
    q.erase(q.begin());
  }


  int xx = min(c,x+y);
  int yy = x+y-xx;
  int ans = 0;
  while(yy--)
  {
    auto it = p.rbegin();
    auto it1 = q.rbegin();
    int l1 = INT_MIN, r1 = INT_MIN;
    if(it!=p.rend())
      l1 = *it;
    if(it1!=q.rend())
      r1 = *it1;
    if(l1>r1)
    {
      ans += l1;
      auto it = p.find(l1);
      p.erase(it);
    }
    else
    {
      ans += r1;
      auto it = q.find(r1);
      q.erase(it);
    }
  }

  
  int arr[c];
  inp(arr, c);
  sort(arr, arr+c, greater<int>());
  rep(i,1,c-1)
  arr[i] += arr[i-1];
  int f1 = 0;
  for(int i=xx; i>=0; i--)
  {
    if(i!=0)
      f1 = max(f1, ans+arr[i-1]);
    else
      f1 = max(f1, ans);
    if(i==0)
    {
      cout << f1 << endl;
      return;
    }
    auto it = p.rbegin();
    auto it1 = q.rbegin();
    int l1 = INT_MIN, r1 = INT_MIN;
    if(it!=p.rend())
      l1 = *it;
    if(it1!=q.rend())
      r1 = *it1;
    if(l1>r1)
    {
      ans += l1;
      auto it = p.find(l1);
      p.erase(it);
    }
    else
    {
      ans += r1;
      auto it = q.find(r1);
      q.erase(it);
    }
  }

  cout << f1 << endl;
}

signed main()
{
    speed;
    int t = 1;
    //cin >> t;
    while(t--)
        solve();
}


Measured memory_bytes: 10368