#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 5;
const long long Mod = 1e9 + 7;
long long n, m, mod, ans, A[N], B[N], C[N], D[N];
inline long long read() {
  long long ret = 0, f = 0;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = 1;
    c = getchar();
  }
  while (isdigit(c)) {
    ret = ret * 10 + c - 48;
    c = getchar();
  }
  if (f) return -ret;
  return ret;
}
struct node {
  long long m[105][105];
} a, b, res;
node operator*(node a, node b) {
  node c;
  for (long long i = 0; i < mod; i++)
    for (long long j = 0; j < mod; j++) c.m[i][j] = 0;
  for (long long i = 0; i < mod; i++)
    for (long long j = 0; j < mod; j++)
      for (long long k = 0; k < mod; k++)
        c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j]) % Mod;
  return c;
}
node kuai(node a, long long b) {
  for (long long i = 0; i < mod; i++) res.m[i][i] = 1;
  while (b) {
    if (b & 1) res = res * a;
    a = a * a;
    b = b / 2;
  }
  return res;
}
signed main() {
  n = read();
  m = read();
  mod = read();
  for (long long i = 1; i <= n; i++) {
    long long x = read() % mod;
    A[x]++;
  }
  for (long long i = 1; i <= n; i++) {
    long long x = read() % mod;
    B[x]++;
    D[i] = x;
  }
  for (long long i = 1; i <= n; i++) C[i] = read();
  for (long long i = 0; i < mod; i++) {
    for (long long j = 0; j < mod; j++) {
      if (i >= j)
        a.m[i][j] = B[i - j];
      else
        a.m[i][j] = B[i + mod - j];
    }
  }
  a = kuai(a, m - 2);
  for (long long i = 0; i < mod; i++) b.m[i][0] = A[i];
  a = a * b;
  for (long long i = 0; i < mod; i++)
    for (long long j = 1; j <= n; j++)
      if ((i + D[j] + C[j]) % mod == 0) ans = (ans + a.m[i][0]) % Mod;
  cout << ans;
  return 0;
}
