#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;

const int P = 1000000007;
const int M = 205;

// given first m a[i] and coef c[i] (0-based),
// calc a[n] mod p in O(m*m*log(n)).
// a[n] = sum(c[m-i]*a[n-i]), i = 1...m
// i.e. a[m] = sum(c[i]*a[i]), i = 0...m-1
int linear_recurrence(LL n, int m, int a[], int c[], int p) {
	LL v[M] = {1 % p}, u[M<<1], msk = !!n;
	for(LL i = n; i > 1; i >>= 1) msk <<= 1;
	for(LL x = 0; msk; msk >>= 1, x <<= 1) {
		fill_n(u, m<<1, 0);
		int b = !!(n & msk); x |= b;
		if(x < m) u[x] = 1 % p;
		else {
			for(int i = 0; i < m; ++i)
				for(int j = 0, t = i+b; j < m; ++j, ++t)
					u[t] = (u[t]+v[i]*v[j]) % p;
			for(int i = (m<<1)-1; i >= m; --i)
				for(int j = 0, t = i-m; j < m; ++j, ++t)
					u[t] = (u[t]+c[j]*u[i]) % p;
		}
		copy(u, u+m, v);
	}
	int an = 0;
	for(int i = 0; i < m; ++i) an = (an+v[i]*a[i]) % p;
	return an;
}

LL n;
int m, u, d, a[55], b[55], c[M], f[M];

int main() {
	while(1==scanf("%lld", &n)) {
		scanf("%d", &u);
		for(int i = 0; i < u; ++i) scanf("%d", a+i);
		scanf("%d", &d);
		for(int i = 0; i < d; ++i) scanf("%d", b+i);
		m = *max_element(b, b+d) + 1;
		memset(c, 0, sizeof(c));
		c[0] = 1;
		for(int i = 0; i < m; ++i) {
			for(int j = 0; j < u; ++j) if(i+a[j] < m) {
				c[i+a[j]] = (c[i+a[j]]+c[i]) % P;
			}
		}
		for(int i = 0; i < d; ++i) {
			c[b[i]] = -c[b[i]];
		}
		for(int i = 0; i < m; ++i) {
			if(c[i] >= 0) c[i] = 0;
			else c[i] = -c[i];
		}
		memset(f, 0, sizeof(f));
		f[0] = 1;
		for(int i = 1; i < m; ++i) {
			for(int j = 1; j <= i; ++j) {
				f[i] = (f[i]+(LL)f[i-j]*c[j]) % P;
			}
		}
		reverse(c, c+m);
		int ans = linear_recurrence(n, m-1, f, c, P);
		printf("%d\n", ans);
	}
}
