#include <bits/stdc++.h>
using namespace std;
long long powm(long long base, long long exp, long long mod = 1000000007) {
  long long ans = 1;
  while (exp) {
    if (exp & 1) ans = (ans * base) % mod;
    exp >>= 1, base = (base * base) % mod;
  }
  return ans;
}
long long ctl(char x, char an = 'a') { return (long long)(x - an); }
char ltc(long long x, char an = 'a') { return (char)(x + an); }
int M;
int add(int a, int b, int m = 1000000007) {
  int tmp = a + b;
  if (tmp >= m) tmp -= m;
  return tmp;
}
int sub(int a, int b, int m = 1000000007) {
  int tmp = a - b;
  if (tmp < 0) tmp += m;
  if (tmp >= m) tmp -= m;
  return tmp;
}
int mul(int a, int b, int m = 1000000007) {
  long long tmp = 1LL * a * b;
  if (tmp >= m) tmp %= m;
  return tmp;
}
int powm(int base, int exp, int m = 1000000007) {
  int ans = 1;
  while (exp) {
    if (exp & 1) ans = mul(ans, base, m);
    exp >>= 1, base = mul(base, base, m);
  }
  return ans;
}
struct matrix {
  int mat[105][105];
} mt;
matrix mult(matrix a, matrix b) {
  matrix c;
  for (int i = 0; i < M; i++)
    for (int j = 0; j < M; j++) c.mat[i][j] = 0;
  for (int i = 0; i < M; i++)
    for (int j = 0; j < M; j++)
      for (int k = 0; k < M; k++)
        c.mat[i][j] = add(c.mat[i][j], mul(a.mat[i][k], b.mat[k][j]));
  return c;
}
matrix powm(matrix base, int exp) {
  matrix ans;
  for (int i = 0; i < M; i++)
    for (int j = 0; j < M; j++) ans.mat[i][j] = (i == j);
  while (exp) {
    if (exp & 1) ans = mult(ans, base);
    base = mult(base, base), exp >>= 1;
  }
  return ans;
}
int a[1000005], b[1000005], c[1000005];
int num[105], final[105], tmp[105];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, l, m;
  cin >> n >> l >> m;
  M = m;
  for (int i = 1; i < n + 1; i++) cin >> a[i], tmp[a[i]]++;
  for (int i = 1; i < n + 1; i++) cin >> c[i];
  for (int i = 1; i < n + 1; i++) cin >> b[i];
  for (int i = 1; i < n + 1; i++) num[c[i] % m]++;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) mt.mat[i][j] = num[sub(i, j, m)];
  mt = powm(mt, l - 2);
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++)
      final[i] = add(final[i], mul(mt.mat[i][j], tmp[j]));
  int ans = 0;
  for (int i = 1; i < n + 1; i++)
    ans = add(ans, final[add(sub(0, c[i], m), sub(0, b[i], m), m)]);
  cout << ans;
  return 0;
}
