#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;
}
