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;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXA = 10;
const int MAXB = 100;
const int MAXBVAL = 250;
const int MOD = 1000000007;
typedef struct State {
  vector<int> ways;
  State(int bmx) { ways = vector<int>(bmx, 0); }
} State;
int na, nb;
long long N;
int a[MAXA], b[MAXB];
int bmx;
int bcnt[MAXBVAL + 1];
void inc(int &a, int b) {
  if ((a += b) >= MOD) a -= MOD;
}
void inc(State &a, const State &b) {
  for (int i = (0); i < (bmx); ++i) inc(a.ways[i], b.ways[i]);
}
void mlt(State &a, const State &b) {
  vector<int> ways(2 * bmx - 1, 0);
  for (int i = (0); i < (bmx); ++i)
    for (int j = (0); j < (bmx); ++j)
      ways[i + j] = (ways[i + j] + (long long)a.ways[i] * b.ways[j]) % MOD;
  for (int i = 2 * bmx - 2; i >= bmx; --i)
    if (ways[i] != 0) {
      for (int j = (0); j <= (bmx); ++j)
        if (bcnt[j] != 0)
          ways[i - j] = (ways[i - j] + (long long)bcnt[j] * ways[i]) % MOD;
      ways[i] = 0;
    }
  ways.resize(bmx);
  a.ways = ways;
}
int pw(int x, int n) {
  int a = 1;
  while (true) {
    if (n & 1) a = (long long)a * x % MOD;
    if ((n >>= 1) == 0) return a;
    x = (long long)x * x % MOD;
  }
}
void pw(State &a, long long n) {
  State x = a;
  for (int i = (0); i < (bmx); ++i) a.ways[i] = i == 0 ? 1 : 0;
  while (true) {
    if (n & 1) mlt(a, x);
    if ((n >>= 1) == 0) break;
    mlt(x, x);
  }
}
int solve() {
  bmx = b[0];
  for (int i = (1); i < (nb); ++i)
    if (b[i] > bmx) bmx = b[i];
  for (int i = (0); i <= (bmx); ++i) bcnt[i] = 0;
  for (int i = (0); i < (nb); ++i) ++bcnt[b[i]];
  State asum(bmx);
  for (int i = (0); i < (na); ++i) {
    State cur(bmx);
    if (1 < bmx)
      ++cur.ways[1];
    else
      cur.ways[0] += bcnt[1];
    pw(cur, a[i]);
    inc(asum, cur);
  }
  pw(asum, N);
  {
    State cur(bmx);
    if (1 < bmx)
      ++cur.ways[1];
    else
      cur.ways[0] += bcnt[1];
    pw(cur, bmx);
    mlt(asum, cur);
  }
  int ret = (long long)asum.ways[0] * pw(bcnt[bmx], MOD - 2) % MOD;
  return ret;
}
int bf() {
  int amx = a[0];
  for (int i = (1); i < (na); ++i)
    if (a[i] > amx) amx = a[i];
  int amxsum = amx * N;
  vector<int> aways(amxsum + 1, 0);
  aways[0] = 1;
  for (int i = (0); i < (N); ++i)
    for (int j = ((int)(aways).size()) - 1; j >= 0; --j)
      if (aways[j] != 0) {
        for (int k = (0); k < (na); ++k) inc(aways[j + a[k]], aways[j]);
        aways[j] = 0;
      }
  vector<int> bways(amxsum + 1, 0), bwayssum(amxsum + 1, 0);
  bways[0] = bwayssum[0] = 1;
  while (true) {
    bool any = false;
    for (int j = ((int)(bways).size()) - 1; j >= 0; --j)
      if (bways[j]) {
        any = true;
        for (int k = (0); k < (nb); ++k)
          if (j + b[k] < ((int)(bways).size())) inc(bways[j + b[k]], bways[j]);
        bways[j] = 0;
      }
    if (!any) break;
    for (int j = (0); j < (((int)(bways).size())); ++j)
      inc(bwayssum[j], bways[j]);
  }
  int ret = 0;
  for (int j = (0); j <= (amxsum); ++j)
    ret = (ret + (long long)aways[j] * bwayssum[j]) % MOD;
  return ret;
}
void run() {
  scanf("%d%d%lld", &na, &nb, &N);
  for (int i = (0); i < (na); ++i) scanf("%d", &a[i]);
  for (int i = (0); i < (nb); ++i) scanf("%d", &b[i]);
  printf("%d\n", solve());
}
int main() {
  run();
  return 0;
}