#include <bits/stdc++.h>
using namespace std;
int N, L, M;
long long vt[105];
long long st[105], ed[105];
int va[1000005], sta[1000005], eda[1000005];
long long SZ;
const int MAXSZ = 105;
struct Mat {
  long long m[MAXSZ][MAXSZ];
  Mat() { memset(m, 0, sizeof(m)); }
};
Mat matMul(const Mat &A, const Mat &B) {
  Mat rtn;
  for (int i = 0; i < SZ; i++)
    for (int k = 0; k < SZ; k++)
      if (A.m[i][k])
        for (int j = 0; j < SZ; j++) {
          rtn.m[i][j] = (rtn.m[i][j] + A.m[i][k] * B.m[k][j]) % 1000000007;
        }
  return rtn;
}
vector<long long> matMul(const Mat &A, const vector<long long> &B) {
  vector<long long> rtn(SZ, 0);
  for (int i = 0; i < SZ; i++)
    for (int j = 0; j < SZ; j++)
      rtn[i] = (rtn[i] + A.m[i][j] * B[j]) % 1000000007;
  return rtn;
}
Mat matPow(Mat &M, long long p) {
  if (p == 0) {
    Mat iden;
    for (int i = 0; i < SZ; i++) iden.m[i][i] = 1;
    return iden;
  }
  if (p == 1) return M;
  Mat rtn = matPow(M, p / 2);
  if (p & 1)
    return matMul(matMul(rtn, rtn), M);
  else
    return matMul(rtn, rtn);
}
Mat T, TE;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> N >> L >> M;
  for (int i = 1; i <= N; i++) cin >> sta[i];
  for (int i = 1; i <= N; i++) cin >> va[i];
  for (int i = 1; i <= N; i++) cin >> eda[i];
  for (int i = 1; i <= N; i++) {
    vt[va[i] % M]++;
    st[sta[i] % M]++;
    ed[(eda[i] + va[i]) % M]++;
  }
  SZ = M;
  for (int i = 0; i <= M - 1; i++)
    for (int j = 0; j <= M - 1; j++) {
      T.m[i][j] = vt[(i - j + M) % M];
      TE.m[i][j] = ed[(i - j + M) % M];
    }
  vector<long long> V(SZ, 0);
  for (int i = 0; i <= M - 1; i++) V[i] = st[i];
  V = matMul(TE, matMul(matPow(T, L - 2), V));
  cout << V[0] << '\n';
  return 0;
}
