#include <bits/stdc++.h>
using namespace std;
int M;
struct Mat {
  int a[101][101], n, m;
  Mat(int x = 0, int _n = M, int _m = M) {
    n = _n, m = _m;
    memset(a, 0, sizeof a);
    for (int i(0); i < min(n, m); i++) a[i][i] = x;
  }
  int* operator[](int x) { return a[x]; }
};
Mat operator*(Mat& a, Mat& b) {
  Mat ans(0, a.n, b.m);
  for (int i(0); i < a.n; i++)
    for (int k(0); k < a.m; k++)
      for (int j(0); j < b.m; j++)
        ans[i][j] = (ans[i][j] + 1ll * a[i][k] * b[k][j]) % 1000000007;
  return ans;
}
template <class T>
T put(T x, int p) {
  T ans(1);
  while (p) {
    if (p & 1) ans = ans * x;
    x = x * x;
    p /= 2;
  }
  return ans;
}
int frc[110];
int costfin[110];
int v1[1000010], v2[1000010];
int main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  int l, n;
  cin >> n >> l >> M;
  Mat init(0, 1, M);
  Mat mat;
  for (int i(1); i <= n; i++) {
    int x;
    cin >> x;
    init[0][x]++;
  }
  for (int i(1); i <= n; i++) {
    int x;
    cin >> x;
    v1[i] = x;
    frc[x]++;
  }
  for (int i(1); i <= n; i++) {
    int x;
    cin >> x;
    v2[i] = x;
    costfin[x]++;
  }
  for (int i(0); i < M; i++)
    for (int j(0); j < M; j++) mat[i][j] = frc[(j - i + M) % M];
  mat = put(mat, l - 2);
  mat = init * mat;
  int ans(0);
  for (int i(1); i <= n; i++)
    ans = (ans + mat[0][(2 * M - v1[i] - v2[i]) % M]) % 1000000007;
  cout << ans;
  return 0;
}
