#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
const int MOD = 1e9 + 7;
int n, l, m;
struct Matrix {
  int mat[105][105];
  void init() { memset(mat, 0, sizeof mat); }
};
Matrix operator*(Matrix A, Matrix B) {
  Matrix C;
  C.init();
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      for (int k = 0; k < m; k++) {
        C.mat[i][j] =
            (C.mat[i][j] + 1LL * A.mat[i][k] * B.mat[k][j] % MOD) % MOD;
      }
    }
  }
  return C;
}
Matrix operator^(Matrix A, int k) {
  Matrix B;
  B.init();
  for (int i = 0; i < m; i++) B.mat[i][i] = 1;
  while (k) {
    if (k & 1) B = B * A;
    A = A * A;
    k >>= 1;
  }
  return B;
}
int a[105];
int b[MAXN];
template <class T>
inline void scan_d(T &ret) {
  char c;
  ret = 0;
  while ((c = getchar()) < '0' || c > '9')
    ;
  while (c >= '0' && c <= '9') ret = ret * 10 + (c - '0'), c = getchar();
}
int main() {
  Matrix B;
  B.init();
  scanf("%d%d%d", &n, &l, &m);
  for (int i = 0; i < n; i++) {
    int x;
    scan_d(x);
    int d = x % m;
    B.mat[0][d]++;
  }
  for (int i = 0; i < n; i++) {
    int x;
    scan_d(x);
    a[x % m]++;
    b[i] = x % m;
  }
  Matrix A;
  A.init();
  for (int i = 0; i < m; i++) {
    int zz = i;
    for (int j = 0; j <= i; j++) {
      A.mat[j][i] = a[zz--];
    }
    zz = m - 1;
    for (int j = i + 1; j < m; j++) {
      A.mat[j][i] = a[zz--];
    }
  }
  A = A ^ (l - 2);
  A = B * A;
  B.init();
  for (int i = 0; i < n; i++) {
    int x;
    scan_d(x);
    (b[i] += x) %= m;
    int d = b[i];
    if (d) d = m - d;
    B.mat[d][0]++;
  }
  A = A * B;
  cout << A.mat[0][0] << endl;
  return 0;
}
