#include <bits/stdc++.h>
using namespace std;
using llint = long long;
const int N = 1e6 + 10, M = 110, B = 1e9 + 7;
int n, m, l;
int c[3][N];
llint ans[M];
llint sum[M];
llint a[M][M];
void updadd(llint &x, llint y) {
  x = (x + y) % B;
  if (x < 0) x += B;
}
llint add(llint x, llint y) {
  x = (x + y) % B;
  if (x < 0) x += B;
  return x;
}
void gen_matrix() {
  vector<int> cnt(m, 0);
  for (int i = 1; i <= n; ++i) {
    int tmp = c[1][i];
    cnt[tmp % m]++;
  }
  memset(a, 0, sizeof(a));
  for (int i = 0; i < m; ++i) {
    for (int j = 0; j < m; ++j) {
      a[i][(i + j) % m] += cnt[j];
    }
  }
}
void cpy(llint a[M][M], llint c[M][M]) {
  for (int i = 0; i < m; ++i)
    for (int j = 0; j < m; ++j) a[i][j] = c[i][j];
}
void mul(llint a[M][M], llint b[M][M]) {
  llint c[M][M];
  memset(c, 0, sizeof(c));
  for (int i = 0; i < m; ++i) {
    for (int j = 0; j < m; ++j) {
      for (int k = 0; k <= m; ++k) {
        updadd(c[i][j], 1ll * a[i][k] * b[k][j] % B);
      }
    }
  }
  cpy(a, c);
}
void mypw(llint a[M][M], int b) {
  llint c[M][M];
  memset(c, 0, sizeof(c));
  for (int i = 0; i < m; ++i) c[i][i] = 1;
  while (b) {
    if (b & 1) mul(c, a);
    mul(a, a);
    b >>= 1;
  }
  cpy(a, c);
}
void go_sum() {
  memset(sum, 0, sizeof(sum));
  for (int i = 1; i <= n; ++i) {
    sum[c[0][i] % m]++;
  }
}
void mul_sum_a() {
  vector<int> tmp(m, 0);
  for (int i = 0; i < m; ++i) {
    for (int j = 0; j < m; ++j) {
      tmp[j] = add(tmp[j], 1ll * sum[i] * a[i][j] % B);
    }
  }
  for (int i = 0; i < m; ++i) sum[i] = tmp[i];
}
void run() {
  scanf("%d%d%d", &n, &l, &m);
  for (int j = 0; j < 3; ++j) {
    for (int i = 1; i <= n; ++i) {
      scanf("%d", c[j] + i);
    }
  }
  gen_matrix();
  mypw(a, l - 2);
  go_sum();
  mul_sum_a();
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j < m; ++j) {
      updadd(ans[(j + c[2][i] + c[1][i]) % m], sum[j]);
    }
  }
  printf("%lld\n", ans[0]);
}
int main() {
  run();
  return 0;
}
