#include <bits/stdc++.h>
using namespace std;
const double eps = 0.000000000000001;
string convertstring(long long n) {
  stringstream ss;
  ss << n;
  return ss.str();
}
long long c[105][105], temp[105][105], st[1000005], en[1000005], cost[1000005],
    hsh[105], hsh1[105], hsh2[105], xxx[105][105];
long long m, mat[105][105];
const long long MODD = (long long)1000000007 * 1000000007;
void mul(long long a[][105], long long b[][105]) {
  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) {
        c[i][j] += a[i][k] * b[k][j];
        if (c[i][j] >= MODD) c[i][j] -= MODD;
      }
    }
  }
  for (int i = 0; i < m; ++i) {
    for (int j = 0; j < m; ++j) {
      a[i][j] = c[i][j] % 1000000007;
    }
  }
}
void powm(long long mat[][105], long long n) {
  if (n <= 1) return;
  powm(mat, n / 2);
  mul(mat, mat);
  if (n & 1) mul(mat, temp);
}
int main() {
  long long n, l, i, j;
  scanf("%lld%lld%lld", &n, &l, &m);
  ;
  for (i = 0; i < n; ++i) {
    scanf("%lld", &st[i]);
    ;
    st[i] %= m;
    hsh1[st[i]]++;
  }
  for (i = 0; i < n; ++i) {
    scanf("%lld", &cost[i]);
    ;
    cost[i] %= m;
    hsh[cost[i]]++;
  }
  for (i = 0; i < n; ++i) {
    scanf("%lld", &en[i]);
    ;
    en[i] %= m;
    hsh2[en[i]]++;
    xxx[cost[i]][en[i]]++;
  }
  for (i = 0; i < m; ++i) {
    for (j = 0; j < m; ++j) {
      mat[i][j] = hsh[(i - j + m) % m];
      temp[i][j] = mat[i][j];
    }
  }
  powm(mat, l - 2);
  if (l == 2)
    for (i = 0; i < m; ++i)
      for (j = 0; j < m; ++j)
        if (i != j)
          mat[i][j] = 0;
        else
          mat[i][j] = 1;
  long long ans = 0;
  for (i = 0; i < m; ++i) {
    for (j = 0; j < m; ++j) {
      long long x = i + j;
      for (int k = 0; k < m; ++k) {
        x = x + k;
        long long rem = ((-x) % m + m) % m;
        ans += (hsh1[i] * mat[k][0]) % 1000000007 * xxx[rem][j];
        ans %= 1000000007;
        x -= k;
      }
    }
  }
  cout << ans << endl;
  return 0;
}
