#include <bits/stdc++.h>
using namespace std;
const int M = 1e6 + 7;
const int N = 107;
const int Q = 1e9 + 7;
inline int pls(int x, int y) { return (x + y) % Q; }
inline int mns(int x, int y) { return pls(x, Q - y); }
inline int mul(int x, int y) { return 1LL * x * y % Q; }
inline int ri() {
  int x = 0;
  bool f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = 0;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;
  return f ? x : -x;
}
namespace Mat {
int n;
void mt(int A[][N], int B[][N], int C[][N]) {
  static int a[N][N], b[N][N];
  memcpy(a, A, sizeof a);
  memcpy(b, B, sizeof a);
  memset(C, 0, sizeof a);
  for (int i = (0); i < (n); ++i)
    for (int k = (0); k < (n); ++k)
      for (int j = (0); j < (n); ++j)
        C[i][j] = pls(C[i][j], mul(a[i][k], b[k][j]));
}
void qp(int A[][N], int tms, int B[][N]) {
  static int a[N][N];
  memcpy(a, A, sizeof a);
  memset(B, 0, sizeof a);
  for (int i = (0); i < (n); ++i) B[i][i] = 1;
  for (; tms > 0; tms >>= 1) {
    if (tms & 1) mt(B, a, B);
    mt(a, a, a);
  }
}
}  // namespace Mat
int n, L, m;
int cost[M];
int tmp[N];
int A[N][N], B[N][N], T[N][N];
inline int mo(int a) { return (a % m + m) % m; }
int main() {
  int i;
  n = ri(), L = ri() - 2, m = ri();
  Mat::n = m;
  memset(A, 0, sizeof A);
  for (int i = (1); i <= (n); ++i) A[mo(ri())][0]++;
  memset(tmp, 0, sizeof tmp);
  for (int i = (1); i <= (n); ++i) tmp[mo(cost[i] = ri())]++;
  for (int j = (0); j < (m); ++j)
    for (int i = (0); i < (m); ++i) T[i][j] = tmp[mo(i - j)];
  memset(tmp, 0, sizeof tmp);
  for (int i = (1); i <= (n); ++i) tmp[mo(cost[i] += ri())]++;
  for (int j = (0); j < (m); ++j)
    for (int i = (0); i < (m); ++i) B[i][j] = tmp[mo(i - j)];
  Mat::qp(T, L, T);
  Mat::mt(B, T, T);
  Mat::mt(T, A, A);
  printf("%d\n", A[0][0]);
  return 0;
}
