#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
inline int add(int a, int b) {
  if ((a += b) >= mod) a -= mod;
  return a;
}
inline int mult(int a, int b) {
  long long t = 1ll * a * b;
  if (t >= mod) t %= mod;
  return t;
}
inline int power(int a, int b) {
  int out = 1;
  while (b) {
    if (b & 1) out = mult(out, a);
    a = mult(a, a);
    b >>= 1;
  }
  return out;
}
template <int N, int M>
class matrix {
 public:
  int dat[N][M];
  void init() { memset(dat, 0, sizeof(dat)); }
  void iden() {
    init();
    for (int i = 0; i < N; i++) dat[i][i] = 1;
  }
  int *operator[](int x) { return dat[x]; }
  const int *operator[](const int &x) const { return dat[x]; }
  template <int X>
  friend matrix<N, M> operator*(const matrix<N, X> &a, const matrix<X, M> &b) {
    matrix<N, M> out;
    out.init();
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < X; j++) {
        if (a[i][j]) {
          for (int k = 0; k < M; k++) {
            out[i][k] = add(out[i][k], mult(a[i][j], b[j][k]));
          }
        }
      }
    }
    return out;
  }
};
matrix<1, 100> st;
matrix<100, 100> zy;
int ans = 0, v[1000010];
template <int N>
matrix<N, N> power(matrix<N, N> a, int b) {
  matrix<N, N> out;
  out.iden();
  while (b) {
    if (b & 1) out = out * a;
    a = a * a;
    b >>= 1;
  }
  return out;
}
int n, l, m, cnt[110];
int main() {
  scanf("%d%d%d", &n, &l, &m);
  for (int i = 1, ti; i <= n; i++) {
    scanf("%d", &ti);
    st[0][ti % m]++;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &v[i]);
    cnt[v[i] % m]++;
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      zy[i][(i + j) % m] += cnt[j];
    }
  }
  st = st * power(zy, l - 2);
  for (int i = 1, ti; i <= n; i++) {
    scanf("%d", &ti);
    ans = add(ans, st[0][(2 * m - ti - v[i]) % m]);
  }
  printf("%d\n", ans);
  return 0;
}
