#include<iostream>
#include<vector>
#include<deque>
#include<algorithm>
#define _USE_MATH_DEFINES
#include<cmath>
#include<cstdlib>
#include<string>

using namespace std;

struct T {
    int price, amounts;
    T() {}
    T(int price, int amounts) :price(price), amounts(amounts) {}
    bool operator< (T& other) {
        return price < other.price;
    }
};

int main() {
    while (true) {
        int L, S, M, D, B;
        cin >> L >> S >> M >> D >> B;
        if (L == 0)
            return 0;
        const int MAXSUM = 200000007;
        // FIRST RUN
        vector<int> arr(MAXSUM, 0);
        vector<T> vecA;
        vector<T> vecB;
        vector<int> aPrices;
        vector<int> bPrices;
        int price;
        for (int i = 0; i < S; ++i) {
            cin >> price;
            aPrices.push_back(price);
        }
        for (int i = 0; i < M; ++i) {
            cin >> price;
            bPrices.push_back(price);
        }
        //cout << "read a" << endl;
        for (int priceA: aPrices) {
            for (int priceB: bPrices) {
                ++arr[priceA + priceB];
            }
        }
        for (int i = 0; i < MAXSUM; ++i) {
            if (arr[i] != 0)
                vecA.push_back(T(i, arr[i]));
        }
        //cout << "sorting a" << endl;
        sort(vecA.begin(), vecA.end());

        // SECOND RUN
        aPrices = vector<int>();
        bPrices = vector<int>();
        arr = vector<int>(MAXSUM, 0);
        for (int i = 0; i < D; ++i) {
            cin >> price;
            aPrices.push_back(price);
        }
        for (int i = 0; i < B; ++i) {
            cin >> price;
            bPrices.push_back(price);
        }
        //cout << "read b" << endl;
        for (int priceA: aPrices) {
            for (int priceB: bPrices) {
                ++arr[priceA + priceB];
            }
        }
        for (int i = 0; i < MAXSUM; ++i) {
            if (arr[i] != 0)
                vecB.push_back(T(i, arr[i]));
        }
        //cout << "sorting B" << endl;
        sort(vecB.begin(), vecB.end());

        /*cout << "ALIST" << endl;
        for (auto elem: vecA) {
            cout << elem.price << " " << elem.amounts << endl;
        }
        cout << "BLIST" << endl;
        for (auto elem: vecB) {
            cout << elem.price << " " << elem.amounts << endl;
        }
        cout << endl;*/

        int aPtr = 0;
        int bPtr = vecB.size() - 1;
        long long tempTotalA = 0;
        long long totalA = 0;
        long long sum = 0;
        while (aPtr < vecA.size() && bPtr >= 0) {
            T a = vecA[aPtr];
            T b = vecB[bPtr];

            if (a.price + b.price > L) {
                --bPtr;
                totalA += tempTotalA;
                tempTotalA = 0;
                continue;
            }

            //cout << "ADD " << a.price << " " << b.price << endl;
            sum += (totalA + a.amounts) * b.amounts;
            tempTotalA += a.amounts;
            ++aPtr;
        }
        cout << sum << endl;
    }
    return 0;
}