#include <bits/stdc++.h>
using namespace std;
const long long mo = (long long)(1e9 + 7);
int rem[1000000 + 5];
struct mat {
  int r, c;
  long long a[110][110];
  mat() { memset(a, 0, sizeof(a)); }
  mat operator*(const mat& b) const {
    mat ans;
    ans.r = r;
    ans.c = b.c;
    for (int i = 1; i <= ans.r; i++)
      for (int j = 1; j <= ans.c; j++)
        for (int k = 1; k <= c; k++)
          ans.a[i][j] = (ans.a[i][j] + a[i][k] % mo * b.a[k][j] % mo) % mo;
    return ans;
  }
};
mat qpow(mat x, long long k) {
  mat ans = x;
  --k;
  while (k) {
    if (k & 1) ans = ans * x;
    x = x * x;
    k >>= 1;
  }
  return ans;
}
int n, l, m;
int po[3][110];
int main() {
  scanf("%d%d%d", &n, &l, &m);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    po[0][x]++;
  }
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    rem[i] = x;
    po[1][x]++;
  }
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    x = (x + rem[i]) % m;
    po[2][x]++;
  }
  mat st;
  st.r = m;
  st.c = 1;
  st.a[1][1] = 1;
  mat bas;
  bas.r = bas.c = m;
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      bas.a[i + 1][(i - j + m) % m + 1] = po[0][j];
    }
  }
  st = bas * st;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) bas.a[i + 1][j + 1] = 0;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) {
      bas.a[i + 1][(i - j + m) % m + 1] = po[1][j];
    }
  if (l > 2) st = qpow(bas, l - 2) * st;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) bas.a[i + 1][j + 1] = 0;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) {
      bas.a[i + 1][(i - j + m) % m + 1] = po[2][j];
    }
  st = bas * st;
  cout << st.a[1][1] << endl;
  return 0;
}
