#define ENABLE_LL
#include <iostream>
#include <cstdio>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;

void init();
void solve();
int main(){
try { 

#ifndef CUSTOM_MAIN
#ifdef MULTIPLE_TEST_CASES_WITH_T

int T; scanf("%d",&T); while(T--) {init(); solve();}

#else
#ifdef MULTIPLE_TEST_CASES_WITHOUT_T

while(1) {try{init(); } catch(bool t){return 0;} solve(); }

#else

init(); solve();

#endif
#endif
#endif

} catch (const char* s) { return 0; }
    return 0;
}

#ifdef ENABLE_LL
#define int long long
#endif

#ifdef ENABLE_LL
#define I "%lld"
#define II "%lld%lld"
#define III "%lld%lld%lld"
#define IIII "%lld%lld%lld%lld"
#define IN "%lld\n"
#define IIN "%lld%lld\n"
#define IIIN "%lld%lld%lld\n"
#define IIIIN "%lld%lld%lld%lld\n"
#else
#define I "%d"
#define II "%d%d"
#define III "%d%d%d"
#define IIII "%d%d%d%d"
#define IN "%d\n"
#define IIN "%d%d\n"
#define IIIN "%d%d%d\n"
#define IIIIN "%d%d%d%d\n"
#endif

#ifdef __LOCALE__
#define see(a) std::cout << #a << "=" << a << std::endl
#define ses(a) std::cout << #a << "=" << a << " " 
#else
#define see(a) //std::cout << #a << "=" << a << std::endl
#define ses(a)
#endif
#define repe(a,b) for (int a=0;a<(int)b.size();a++)
#define rep(i,n) for (int i=0;i<n;i++)
#define repa(i,n) for (int i=1;i<=n;i++)
#define repi(i,a,b) for (int i=a;i<=b;i++) 
#define repb(i,a,b) for (int i=a;i>=b;i--)
typedef pair < int , int > pr; typedef pair < pr  , int > prr;
#define L first
#define R second
template <class T> inline bool checkMin(T& a , T b) { return (a > b ? a=b,1 : 0); }
template <class T> inline bool checkMax(T& a , T b) { return (a < b ? a=b,1 : 0); }
class Scanner{ private: istream& ist;public: Scanner(istream& in):ist(in){} string next(){ string r; ist >> r; return r; } string nextLine(){ string r; getline(ist,r); return r; } int nextInt(){ int r; ist >> r; return r; } double nextDouble(){ double r; ist >> r; return r; } char nextChar(){ char r; ist>>r; return r;} }; Scanner sc(cin);
void ALERT(bool judgememt, const char* phrase) { if (judgememt) { puts(phrase); throw "ALERT"; } }
bool alert(bool judgememt, const char* phrase) { if (judgememt) puts(phrase); return judgememt; }

const int N = 125;
int a[N], l[N], r[N];
int sa[N], sl, sr;
int n, k;

void init() {
    scanf(II,&n,&k);
    rep (i,n) scanf(I,&a[i]); sort(a,a+n,[](int a,int b){return a>b;}); rep (i,n) sa[i+1] = sa[i] + a[i];
    rep (i,k) scanf(I,&l[i]); sort(l,l+n,[](int a,int b){return a>b;}); rep (i,k) sl+=l[i];
    rep (i,k) scanf(I,&r[i]); sort(r,r+n,[](int a,int b){return a>b;}); rep (i,k) sr+=r[i];
}

int dp[2][N][3005];
void solve() {
    memset(dp,0x3f,sizeof(dp)); dp[0][0][0] = 0;
    repa (i,n) { // i means on a[i]
        int pos=i&1, per=pos^1; memset(dp[pos],0x3f,sizeof(dp[pos]));
        rep (j,min(i,k+1)) rep(t,3005) { // j means j red are chosen , t means their sum (of a)
            if (t+a[i-1]<=sl) checkMin(dp[pos][j+1][t+a[i-1]] , dp[per][j][t] + max(0LL,a[i-1]-l[j])) ;
            if (sa[i-1]-t+a[i-1]<=sr) checkMin(dp[pos][j][t], dp[per][j][t] + max(0LL,a[i-1]-r[i-j-1]));
        }
    }
    int ans=0x3f3f3f3f3f3f3f3f , pos=n&1;
    rep (i,k+1) rep (t,3005) checkMin(ans,dp[pos][i][t]);
    ALERT(ans==0x3f3f3f3f3f3f3f3f,"-1");
    printf(IN,ans);
}




Measured memory_bytes: 9152