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;
namespace IO {
char buf_[1 << 21], *p1_ = buf_, *p2_ = buf_;
inline long long in() {
  long long s = 0, f = 1;
  char x = (p1_ == p2_ && (p2_ = (p1_ = buf_) + fread(buf_, 1, 1 << 21, stdin),
                           p1_ == p2_)
                ? EOF
                : *p1_++);
  for (; x < '0' || x > '9';
       x = (p1_ == p2_ && (p2_ = (p1_ = buf_) + fread(buf_, 1, 1 << 21, stdin),
                          p1_ == p2_)
                ? EOF
                : *p1_++))
    if (x == '-') f = -1;
  for (; x >= '0' && x <= '9';
       x = (p1_ == p2_ && (p2_ = (p1_ = buf_) + fread(buf_, 1, 1 << 21, stdin),
                          p1_ == p2_)
                ? EOF
                : *p1_++))
    s = (s * 10) + (x & 15);
  return f == 1 ? s : -s;
}
char _buf[1 << 21];
long long _pos = -1;
inline void flush() { fwrite(_buf, 1, _pos + 1, stdout), _pos = -1; }
inline void pc(char x) {
  if (_pos == (1 << 21) - 1) flush();
  _buf[++_pos] = x;
}
inline void out(long long x) {
  char k[30];
  long long pos = 0;
  if (!x) return pc('0');
  if (x < 0) pc('-'), x = -x;
  while (x) k[++pos] = (x % 10) | 48, x /= 10;
  for (long long i = pos; i; i--) pc(k[i]);
}
inline void out(string x) {
  long long len = x.size();
  for (long long i = 0; i < len; i++) pc(x[i]);
}
}  // namespace IO
using namespace IO;
const long long A = 1e3 + 5;
const long long mod = 1e9 + 7;
inline long long add(long long x, long long y) {
  return x + y >= mod ? x + y - mod : x + y;
}
inline long long dec(long long x, long long y) {
  return x - y < 0 ? x - y + mod : x - y;
}
inline long long mul(long long x, long long y) { return x * y % mod; }
inline void Add(long long &x, long long y) { x = add(x, y); }
inline void Dec(long long &x, long long y) { x = dec(x, y); }
inline void Mul(long long &x, long long y) { x = mul(x, y); }
long long n, m, C, Max;
long long a[A], b[A];
struct poly {
  vector<long long> p;
  inline long long &operator[](long long x) {
    while (p.size() <= x) p.push_back(0);
    return p[x];
  }
};
poly M;
inline poly operator*(poly x, poly y) {
  poly res;
  for (long long i = 0; i < Max; i++)
    for (long long j = 0; j < Max; j++) Add(res[i + j], mul(x[i], y[j]));
  for (long long i = 2 * Max - 2; i >= Max; i--)
    for (long long j = Max - 1; ~j; j--)
      Dec(res[i - Max + j], mul(res[i], M[j]));
  res.p.resize(Max);
  return res;
}
inline poly operator+(poly x, poly y) {
  for (long long i = 0; i < Max; i++) Add(x[i], y[i]);
  return x;
}
inline poly power(poly x, long long c) {
  poly ans;
  ans[0] = 1;
  for (; c; c >>= 1, x = x * x)
    if (c & 1) ans = ans * x;
  return ans;
}
long long g[A], num[A];
inline void Bag() {
  g[0] = 1;
  for (long long i = 0; i < Max; i++)
    for (long long j = 0; j <= i; j++) Add(g[i], mul(g[i - j], num[j]));
  return;
}
signed main() {
  n = in(), m = in(), C = in();
  for (long long i = 1; i <= n; i++) a[i] = in();
  for (long long i = 1; i <= m; i++)
    b[i] = in(), Max = max(Max, b[i]), num[b[i]]++;
  M.p.resize(Max);
  poly f;
  Add(M[Max], 1);
  for (long long i = 1; i <= m; i++) Dec(M[Max - b[i]], 1);
  poly h;
  if (Max == 1)
    h[0] = dec(0, M[0]);
  else
    h[1] = 1;
  for (long long i = 1; i <= n; i++) f = f + power(h, a[i]);
  f = power(f, C);
  Bag();
  long long ans = 0;
  for (long long i = 0; i < Max; i++) Add(ans, mul(f[i], g[i]));
  out(ans), pc('\n');
  flush();
  return 0;
}