Problem: It's Piegirl's birthday soon, and Pieguy has decided to buy her a bouquet of flowers and a basket of chocolates.

The flower shop has F different types of flowers available. The i-th type of flower always has exactly pi petals. Pieguy has decided to buy a bouquet consisting of exactly N flowers. He may buy the same type of flower multiple times. The N flowers are then arranged into a bouquet. The position of the flowers within a bouquet matters. You can think of a bouquet as an ordered list of flower types.

The chocolate shop sells chocolates in boxes. There are B different types of boxes available. The i-th type of box contains ci pieces of chocolate. Pieguy can buy any number of boxes, and can buy the same type of box multiple times. He will then place these boxes into a basket. The position of the boxes within the basket matters. You can think of the basket as an ordered list of box types.

Pieguy knows that Piegirl likes to pluck a petal from a flower before eating each piece of chocolate. He would like to ensure that she eats the last piece of chocolate from the last box just after plucking the last petal from the last flower. That is, the total number of petals on all the flowers in the bouquet should equal the total number of pieces of chocolate in all the boxes in the basket.

How many different bouquet+basket combinations can Pieguy buy? The answer may be very large, so compute it modulo 1000000007 = 109 + 7.

Input

The first line of input will contain integers F, B, and N (1 ≤ F ≤ 10, 1 ≤ B ≤ 100, 1 ≤ N ≤ 1018), the number of types of flowers, the number of types of boxes, and the number of flowers that must go into the bouquet, respectively.

The second line of input will contain F integers p1, p2, ..., pF (1 ≤ pi ≤ 109), the numbers of petals on each of the flower types.

The third line of input will contain B integers c1, c2, ..., cB (1 ≤ ci ≤ 250), the number of pieces of chocolate in each of the box types.

Output

Print the number of bouquet+basket combinations Pieguy can buy, modulo 1000000007 = 109 + 7.

Examples

Input

2 3 3
3 5
10 3 7


Output

17


Input

6 5 10
9 3 3 4 9 9
9 9 1 6 4


Output

31415926

Note

In the first example, there is 1 way to make a bouquet with 9 petals (3 + 3 + 3), and 1 way to make a basket with 9 pieces of chocolate (3 + 3 + 3), for 1 possible combination. There are 3 ways to make a bouquet with 13 petals (3 + 5 + 5, 5 + 3 + 5, 5 + 5 + 3), and 5 ways to make a basket with 13 pieces of chocolate (3 + 10, 10 + 3, 3 + 3 + 7, 3 + 7 + 3, 7 + 3 + 3), for 15 more combinations. Finally there is 1 way to make a bouquet with 15 petals (5 + 5 + 5) and 1 way to make a basket with 15 pieces of chocolate (3 + 3 + 3 + 3 + 3), for 1 more combination.

Note that it is possible for multiple types of flowers to have the same number of petals. Such types are still considered different. Similarly different types of boxes may contain the same number of pieces of chocolate, but are still considered different.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int get() {
  char ch;
  while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-')
    ;
  if (ch == '-') {
    int s = 0;
    while (ch = getchar(), ch >= '0' && ch <= '9') s = s * 10 + ch - '0';
    return -s;
  }
  int s = ch - '0';
  while (ch = getchar(), ch >= '0' && ch <= '9') s = s * 10 + ch - '0';
  return s;
}
const int L = 8005;
const int mo = 1e9 + 7;
int n, m;
long long k;
int d[15];
int c[L];
int Mo[L], Mxr;
long long f0[L], sum[L], a[L], ans[L];
long long tmp[L * 2];
long long add(long long x, long long y) {
  return x + y >= mo ? x + y - mo : x + y;
}
long long dec(long long x, long long y) { return x >= y ? x - y : x + mo - y; }
const int Blk = 32767;
const int MAXN = 34000;
const double pi = acos(-1);
struct comp {
  double x, y;
  comp(const double x_ = 0, const double y_ = 0) {
    x = x_;
    y = y_;
  }
};
comp operator+(comp a, comp b) { return comp(a.x + b.x, a.y + b.y); }
comp operator-(comp a, comp b) { return comp(a.x - b.x, a.y - b.y); }
comp operator*(comp a, comp b) {
  return comp(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
}
comp conj(comp a) { return comp(a.x, -a.y); }
int N, len;
int bitr[MAXN];
comp A[MAXN], B[MAXN], C[MAXN], D[MAXN];
void prepare() {
  for (int i = 0; i <= N - 1; i++) {
    bitr[i] = 0;
    for (int j = 0; j <= len - 1; j++)
      if ((i & (1 << j)) > 0) bitr[i] ^= (1 << (len - 1 - j));
  }
}
void DFT(comp *a) {
  for (int i = 0; i <= N - 1; i++)
    if (i < bitr[i]) swap(a[i], a[bitr[i]]);
  for (int now = 2; now <= N; now <<= 1) {
    comp w = comp(1, 0), g = comp(cos(pi * 2 / now), sin(pi * 2 / now));
    int half = now / 2;
    for (int i = 0; i <= half - 1; i++) {
      for (int j = i; j < N; j += now) {
        comp l = a[j], r = a[j + half] * w;
        a[j + half] = l - r;
        a[j] = l + r;
      }
      w = w * g;
    }
  }
}
void IDFT(comp *a) {
  for (int i = 0; i <= N - 1; i++)
    if (i < bitr[i]) swap(a[i], a[bitr[i]]);
  for (int now = 2; now <= N; now <<= 1) {
    comp w = comp(1, 0), g = comp(cos(pi * 2 / now), -sin(pi * 2 / now));
    int half = now / 2;
    for (int i = 0; i <= half - 1; i++) {
      for (int j = i; j < N; j += now) {
        comp l = a[j], r = a[j + half] * w;
        a[j + half] = l - r;
        a[j] = l + r;
      }
      w = w * g;
    }
  }
  for (int i = 0; i <= N - 1; i++) {
    a[i].x = a[i].x / N;
    a[i].y = a[i].y / N;
  }
}
void fft(long long *a, long long *b, long long *tmp) {
  for (int i = 0; i <= N - 1; i++)
    A[i] = comp(a[i] >> 15, a[i] & Blk), B[i] = comp(b[i] >> 15, b[i] & Blk);
  DFT(A), DFT(B);
  for (int i = 0; i <= N - 1; i++) {
    comp x = A[i], y = A[i == 0 ? 0 : N - i];
    comp a1 = (x + conj(y)) * comp(0.5, 0), a0 = (x - conj(y)) * comp(0, -0.5);
    x = B[i], y = B[i == 0 ? 0 : N - i];
    comp b1 = (x + conj(y)) * comp(0.5, 0), b0 = (x - conj(y)) * comp(0, -0.5);
    C[i] = a1 * b1 + a0 * b0 * comp(0, 1);
    D[i] = a0 * b1 + a1 * b0;
  }
  IDFT(C), IDFT(D);
  for (int i = 0; i <= N - 1; i++) {
    long long c0 = C[i].x + 0.3, c1 = C[i].y + 0.3, d0 = D[i].x + 0.3;
    long long v = add(((((c0 % mo) << 15) % mo) << 15) % mo, c1 % mo);
    v = add(v, ((d0 % mo) << 15) % mo);
    tmp[i] = v;
  }
}
long long res[MAXN], dv[MAXN];
long long ny[MAXN], q0[MAXN];
long long s0[MAXN], s1[MAXN];
void getNy(int n) {
  if (n == 1) {
    ny[0] = 1;
    return;
  }
  int l;
  getNy(l = n / 2 + (n & 1));
  N = 1, len = 0;
  while (N <= n + l + l) N <<= 1, len++;
  prepare();
  for (int i = 0; i <= N - 1; i++) s0[i] = 0;
  for (int i = 0; i <= n - 1; i++) s0[i] = q0[i];
  fft(ny, ny, tmp);
  fft(tmp, s0, tmp);
  for (int i = 0; i <= n - 1; i++) ny[i] = (ny[i] * 2 + mo - tmp[i]) % mo;
}
void getny() {
  for (int i = 0; i <= Mxr; i++) q0[i] = Mo[Mxr - i];
  getNy(Mxr);
}
void Mod() {
  int n = 0, m = Mxr;
  for (int i = Mxr * 2 - 2; i >= 0; i--)
    if (tmp[i]) {
      n = i;
      break;
    }
  if (n < m) {
    for (int i = 0; i <= m - 1; i++) res[i] = tmp[i];
    return;
  }
  N = 1, len = 0;
  while (N <= (n - m) * 2) N <<= 1, len++;
  prepare();
  for (int i = 0; i <= N - 1; i++) s0[i] = s1[i] = 0;
  for (int i = 0; i <= n - m; i++) s0[i] = tmp[n - i], s1[i] = ny[i];
  fft(s0, s1, dv);
  for (int i = n - m + 1; i <= N; i++) dv[i] = 0;
  reverse(dv, dv + n - m + 1);
  N = 1, len = 0;
  while (N <= n) N <<= 1, len++;
  prepare();
  for (int i = 0; i <= N - 1; i++) s0[i] = s1[i] = 0;
  for (int i = 0; i <= m; i++) s0[i] = Mo[i];
  for (int i = 0; i <= n - m; i++) s1[i] = dv[i];
  fft(s0, s1, dv);
  for (int i = 0; i <= m - 1; i++) res[i] = dec(tmp[i], dv[i]);
}
void multi(long long *a, long long *b, long long *c) {
  N = 1, len = 0;
  while (N <= Mxr * 2) N <<= 1, len++;
  prepare();
  fft(a, b, tmp);
  Mod();
  for (int i = 0; i <= Mxr - 1; i++) c[i] = res[i];
}
int main() {
  n = get();
  m = get();
  scanf("%I64d", &k);
  for (int i = 1; i <= n; i++) d[i] = get();
  for (int i = 1; i <= m; i++) {
    int x = get();
    c[x]++;
    Mxr = max(Mxr, x);
  }
  if (Mxr == 1) Mxr++;
  Mo[Mxr] = 1;
  for (int i = 1; i <= Mxr; i++) Mo[Mxr - i] = c[i] ? mo - c[i] : 0;
  getny();
  f0[0] = 1;
  for (int i = 1; i <= Mxr - 1; i++)
    for (int j = 1; j <= i; j++) f0[i] = add(f0[i], f0[i - j] * c[j] % mo);
  for (int i = 0; i <= Mxr - 1; i++) sum[i] = 0;
  for (int now = 1; now <= n; now++) {
    int tim = d[now];
    for (int i = 0; i <= Mxr - 1; i++) a[i] = ans[i] = 0;
    a[1] = 1;
    ans[0] = 1;
    for (; tim; tim /= 2) {
      if (tim & 1) multi(ans, a, ans);
      multi(a, a, a);
    }
    for (int i = 0; i <= Mxr - 1; i++) sum[i] = add(sum[i], ans[i]);
  }
  long long tim = k;
  for (int i = 0; i <= Mxr - 1; i++) a[i] = sum[i], ans[i] = 0;
  ans[0] = 1;
  for (; tim; tim /= 2) {
    if (tim & 1) multi(ans, a, ans);
    multi(a, a, a);
  }
  long long v = 0;
  for (int i = 0; i <= Mxr - 1; i++) v = add(v, ans[i] * f0[i] % mo);
  printf("%I64d\n", v);
  return 0;
}