#include <iostream>
#include <string>
#include <set>
#include <vector>

#define multi_set multiset

using namespace std;

void read(multi_set<int> &vec, const int num) {
	int n;
	for (int i = 0; i < num; ++i) {
		cin >> n;
		vec.insert(n);
	}
}

unsigned long cnt = 0;

unsigned long evaluate(vector<multi_set<int> > &m, unsigned long max, int mi=0) {
	unsigned long res = 0, prevres=0;
	unsigned long previ = 0;
	for (multi_set<int>::iterator i = m[mi].begin(); i != m[mi].end(); ++i) {
		if (unsigned(*i) > max) {
			break;
		}
		if (mi == 3) {
			++ res;
			continue;
		}
		if (previ > 0 && unsigned(*i) == previ) {
			res += prevres;
			continue;
		}
		previ = *i;
		res += (prevres=evaluate(m, max-*i, mi+1));
	}
	return res;
}

int main() {
	while (1) {
		unsigned long L;
		int S, M, D, B;
		cin >> L >> S >> M >> D >> B;
		if (L+S+M+D+B == 0) {
			break;
		}
		vector<multi_set<int> > meals;
		meals.push_back(multi_set<int>()); read(meals.back(), S);
		meals.push_back(multi_set<int>()); read(meals.back(), M);
		meals.push_back(multi_set<int>()); read(meals.back(), D);
		meals.push_back(multi_set<int>()); read(meals.back(), B);
		cout << evaluate(meals, L) << endl;
		//cout << cnt << endl;
		//cnt = 0;
	}
	return 0;
}