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