#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
double fRand(double fMin, double fMax) {
  double f = (double)rand() / RAND_MAX;
  return fMin + f * (fMax - fMin);
}
template <class T>
T min(T a, T b, T c) {
  return min(a, min(b, c));
}
template <class T>
T max(T a, T b, T c) {
  return max(a, max(b, c));
}
struct matrix {
  vector<vector<int> > a;
  int m, n;
  matrix(int _m, int _n) {
    m = _m;
    n = _n;
    a.resize(m);
    for (int i = (0); i <= (m - 1); ++i) a[i].resize(n);
  }
  bool inline operator==(const matrix &o) const {
    if (m != o.m || n != o.n) return false;
    for (int i = (0); i <= (m - 1); ++i) {
      for (int j = (0); j <= (n - 1); ++j) {
        if (a[i][j] != o.a[i][j]) return false;
      }
    }
    return true;
  }
  void inline operator=(const matrix &o) {
    m = o.m;
    n = o.n;
    for (int i = (0); i <= (m - 1); ++i) {
      for (int j = (0); j <= (n - 1); ++j) a[i][j] = o.a[i][j];
    }
  }
  matrix inline operator*(const matrix &o) const {
    matrix c(m, o.n);
    for (int i = (0); i <= (m - 1); ++i) {
      for (int j = (0); j <= (o.n - 1); ++j) {
        c.a[i][j] = 0;
        for (int k = (0); k <= (n - 1); ++k)
          c.a[i][j] = (c.a[i][j] + 1LL * a[i][k] * o.a[k][j]) % 1000000007;
      }
    }
    return c;
  }
  void print() {
    for (int i = (0); i <= (m - 1); ++i) {
      for (int j = (0); j <= (n - 1); ++j) printf("%d ", a[i][j]);
      puts("");
    }
    puts("");
  }
};
matrix Identity(int n) {
  matrix I(n, n);
  for (int i = (0); i <= (n - 1); ++i) I.a[i][i] = 1;
  return I;
}
matrix matPow(matrix A, int n) {
  if (n == 0) return Identity(A.m);
  if (n % 2 == 1) return A * matPow(A, n - 1);
  matrix B = matPow(A, n / 2);
  return B * B;
}
int n, l, M, c[3][1000005], dpp[105], last[105];
int main() {
  scanf("%d%d%d", &n, &l, &M);
  for (int i = (0); i <= (2); ++i)
    for (int j = (1); j <= (n); ++j) scanf("%d", &c[i][j]);
  matrix A(1, M);
  for (int i = (1); i <= (n); ++i) ++A.a[0][c[0][i] % M];
  for (int i = (1); i <= (n); ++i) ++dpp[c[1][i] % M];
  matrix B(M, M);
  for (int i = (0); i <= (M - 1); ++i)
    for (int j = (0); j <= (M - 1); ++j) B.a[i][j] = dpp[(j - i + M) % M];
  matrix C = A * matPow(B, l - 2);
  for (int i = (1); i <= (n); ++i) {
    ++last[(c[1][i] + c[2][i]) % M];
  }
  int ans = 0;
  for (int i = (0); i <= (M - 1); ++i) {
    ans = (ans + 1LL * last[i] * C.a[0][(M - i) % M]) % 1000000007;
  }
  printf("%d", ans);
  return 0;
}
