#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
const int MOD = 1e9 + 7;
struct Mat {
  long long arr[101][101];
  Mat() { memset(arr, 0, sizeof(arr)); }
};
Mat operator*(const Mat& l, const Mat& r) {
  Mat pp;
  for (int i = 0; i < 101; i++) {
    for (int j = 0; j < 101; j++) {
      for (int k = 0; k < 101; k++) {
        pp.arr[i][j] += l.arr[i][k] * r.arr[k][j];
        pp.arr[i][j] %= MOD;
      }
    }
  }
  return pp;
}
Mat hamani, mot;
long long n, l, m, inp[3][MAXN], have[MAXN];
Mat mul(Mat m, int v) {
  if (v == 0) {
    return hamani;
  }
  return mul(m * m, v >> 1) * (v & 1 ? m : hamani);
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> l >> m;
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < n; j++) {
      cin >> inp[i][j];
    }
  }
  for (int i = 0; i < 101; i++) {
    hamani.arr[i][i] = 1;
  }
  long long lo[101];
  memset(lo, 0, sizeof(lo));
  for (int i = 0; i < n; i++) {
    lo[inp[1][i] % m]++;
  }
  for (int i = 0; i < n; i++) {
    have[inp[0][i] % m]++;
  }
  for (int i = 0; i < m; i++) {
    for (int j = m - 1; ~j; j--) {
      mot.arr[i][j] = lo[(m - j + i) % m];
    }
  }
  Mat s = mul(mot, l - 2);
  memset(lo, 0, sizeof(lo));
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      lo[i] += have[j] * s.arr[i][j];
      lo[i] %= MOD;
    }
  }
  long long answer = 0;
  for (int i = 0; i < n; i++) {
    answer += lo[((-inp[2][i] - inp[1][i] + 3 * m) % m)];
    answer %= MOD;
  }
  cout << answer << endl;
  return 0;
}
