#include <stdio.h>
#include <limits.h>
#include <algorithm>
#define pmax (1<<17) + 5
#define inf INT_MAX - 5
using namespace std;
int n, g, w, v [25], s [pmax];
void scan ()
{
int i;
scanf ("%d%d", &n, &g);
for (i=0; i < n; ++i)
scanf ("%d", &v [i]);
sort (v, v+n);
}
void back (int w, int pas, int k, int sum)
{
if (pas == n)
{
if (k == 0)
return ;
//printf("? %d %d: %d %d\n", w, k, s[w], s[k] );
if (s [w] > s [w-k]+1)
s [w]=s [w-k]+1;
return ;
}
back(w, pas+1, k, sum);
back(w+(1<<pas), pas+1, k, sum);
if (sum + v[pas] <= g)
back(w+(1<<pas), pas+1, k+(1<<pas), sum+v[pas]);
// back (k, sum, b+1);
// if ((k & (1 << b)) && (sum + v [b+1] <= g))
// back (k ^ (1 << b), sum + v [b+1], b+1);
}
void zeb ()
{
int k=1<<n;
for (int i = 1; i < k; ++i)
s[i] = inf;
back(0, 0, 0, 0);
//for (int i = 1; i < k; ++i)
// printf("%d\n", s[i]);
//s [1]=inf;
//for (w=1; w < k; ++w, s [w]=inf)
// back (w, 0, 0); //fprintf(stderr, "%d\n", s [w]); }
}
int main ()
{
freopen ("zebughil.in", "r", stdin);
freopen ("zebughil.out", "w", stdout);
for (int i=1; i <= 3; ++i)
{
scan ();
zeb ();
printf ("%d\n", s [(1 << n)-1]);
}
return 0;
}