#include <bits/stdc++.h>
using namespace std;
const long long Base = 1e9 + 7;
struct Matrix {
  int n, m;
  long long cost[101][101];
  Matrix() {}
  Matrix(int n_, int m_) {
    n = n_, m = m_;
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= m; j++) cost[i][j] = 0;
  }
  Matrix operator*(Matrix b) {
    Matrix c = Matrix(n, b.m);
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= b.m; j++)
        for (int k = 0; k <= m; k++)
          c.cost[i][j] =
              (c.cost[i][j] + cost[i][k] * b.cost[k][j] % Base) % Base;
    return c;
  }
};
Matrix operator^(Matrix a, long long b) {
  Matrix c = Matrix(a.n, a.m);
  bool ok = false;
  while (b > 0) {
    if (b & 1) {
      if (!ok)
        c = a;
      else
        c = c * a;
      ok = true;
    }
    a = a * a;
    b >>= 1;
  }
  return c;
}
const long long N = 1e6 + 1;
long long n, l, m;
long long a[N], b[N], c[N], counts[N], counts_[N];
int main() {
  scanf("%lld%lld%lld", &n, &l, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    a[i] %= m;
    counts[a[i]]++;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &b[i]);
    b[i] %= m;
    counts_[b[i]]++;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &c[i]);
    c[i] %= m;
  }
  Matrix x = Matrix(m - 1, 0);
  for (int i = 0; i <= m - 1; i++) x.cost[i][0] = counts[i];
  if (l > 2) {
    Matrix tmp = Matrix(m - 1, m - 1);
    for (int i = 0; i <= m - 1; i++)
      for (int j = 0; j <= m - 1; j++)
        if (i < j)
          tmp.cost[i][j] = counts_[i + m - j] % Base;
        else
          tmp.cost[i][j] = counts_[i - j] % Base;
    tmp = tmp ^ (l - 2);
    x = tmp * x;
  }
  for (int i = 1; i <= n; i++) c[i] = (c[i] + b[i]) % m;
  long long ans = 0;
  for (int i = 1; i <= n; i++)
    if (c[i] == 0)
      ans = (ans + x.cost[0][0]) % Base;
    else
      ans = (ans + x.cost[m - c[i]][0]) % Base;
  cout << ans;
}
