#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <unordered_map>
#include <vector>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <climits>
using namespace std;


#define DEBUG(x) cout << ">>> " << #x << " : " << x << endl;
#define REP(i,a) for (int i = 0; i < (a) ; ++i)
#define FOR(i,a,b) for (int i = (a); i <= (b) ; ++i)
#define FORD(i,a,b) for (int i = (a); i >= (b) ; --i)
#define FOREACH(it,a) for (__typeof((a).begin()) it = (a).begin(); it !=(a).end();++it)


const int INF = 1<<29;
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<ii> vii;
typedef  vector<int> vi;


int main(){
ios_base::sync_with_stdio(false);

int L,S,M,D,B;
int x;
while(cin >> L >> S >> M >> D >> B,L){
	unordered_map<int,int> Am,Bm;
	REP(i,S){
		cin >> x;
		Am[x] = 1;
	}
	REP(i,M){
		cin >> x;
		FOREACH(it,Am){
			ii p = *it;
//			DEBUG(p.first);
//			DEBUG(p.second);
			if(p.first + x > L) continue;
			if(Bm.count(p.first + x) == 0){
				Bm[p.first + x] = p.second;
			} else {
				Bm[p.first + x] += p.second;
			}
		}
	}
//	cout << "====D====" << endl;
	Am.clear();
	REP(i,D){
		cin >> x;
		FOREACH(it,Bm){
			ii p = *it;
//			DEBUG(p.first);
//			DEBUG(p.second);
			if(p.first + x > L) continue;
			if(Am.count(p.first + x) == 0){
				Am[p.first + x] = p.second;
			} else {
				Am[p.first + x] += p.second;
			}
		}
	}
//	cout << "====D====" << endl;
	ll res = 0;
	REP(i,B){
		cin >> x;
		FOREACH(it,Am){
			ii p = *it;
//			DEBUG(p.first);
//			DEBUG(p.second);
			if(p.first + x > L) continue;
			res += p.second;
		}
	}	
	cout << res << endl;
}
}