#include <bits/stdc++.h>
using namespace std;
int n, l, m;
vector<int> cost[3];
vector<int> num;
vector<vector<int> > mat;
void read_data() {
  cin >> n >> l >> m;
  for (int i = 0; i < 3; i++) {
    cost[i].reserve(n);
    int ci;
    for (int j = 0; j < n; j++) {
      scanf("%d", &ci);
      cost[i].push_back(ci);
    }
  }
  num.assign(m, 0);
  for (int i = 0; i < n; i++) {
    int mx = cost[1][i] % m;
    num[mx]++;
  }
  mat.resize(m);
  for (int i = 0; i < m; i++) {
    mat[i].resize(m);
  }
  for (int k = 0; k < m; k++)
    for (int j = 0; j < m; j++) mat[(j - k + m) % m][j] = num[k];
}
vector<vector<int> > mul(vector<vector<int> > &a, vector<vector<int> > &b) {
  vector<vector<int> > res;
  int n = a.size();
  int t = a[0].size();
  int m = b[0].size();
  res.resize(n);
  for (int i = 0; i < n; i++) res[i].resize(m);
  for (int i = 0; i < n; i++)
    for (int k = 0; k < m; k++) {
      long long rx = 0;
      for (int j = 0; j < t; j++) {
        rx += (1LL * a[i][j] * b[j][k]);
        rx %= (1000000007);
      }
      res[i][k] = rx;
    }
  return res;
}
vector<vector<int> > bi_pow(vector<vector<int> > base, int e) {
  vector<vector<int> > res;
  int n = base.size();
  res.resize(n);
  for (int i = 0; i < n; i++) {
    res[i].resize(n);
    res[i][i] = 1;
  }
  while (e != 0) {
    if (e & 1) res = mul(res, base);
    e = e >> 1;
    base = mul(base, base);
  }
  return res;
}
int main() {
  read_data();
  vector<vector<int> > start;
  start.resize(1);
  start[0].assign(m, 0);
  for (int i = 0; i < n; i++) start[0][cost[0][i] % m]++;
  mat = bi_pow(mat, l - 2);
  vector<vector<int> > res = mul(start, mat);
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    int t = m - (cost[1][i] + cost[2][i]) % m;
    if (t == m) t = 0;
    ans += res[0][t];
    ans %= (1000000007);
  }
  cout << ans << endl;
  return 0;
}
