#include <bits/stdc++.h>
using namespace std;
int m;
const long long mod = 1e9 + 7;
vector<long long> operator*(const vector<long long> &a,
                            const vector<long long> &b) {
  vector<long long> res(m, 0);
  for (int i = 0; i < int(a.size()); ++i) {
    for (int j = 0; j < int(b.size()); ++j) {
      res[(i + j) % m] += a[i] * b[j];
      res[(i + j) % m] %= mod;
    }
  }
  return res;
}
vector<long long> mpow(vector<long long> a, int b) {
  if (b == 1) return a;
  vector<long long> t = mpow(a * a, b / 2);
  if (b % 2) return t * a;
  return t;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, l;
  cin >> n >> l >> m;
  vector<long long> ini(m, 0), fi(n, 0);
  vector<long long> mid(m, 0);
  vector<long long> mid2(n, 0);
  for (int i = 0; i < n; ++i) {
    int a;
    cin >> a;
    if (a == m)
      ini[0]++;
    else
      ini[a]++;
  }
  for (int i = 0; i < n; ++i) {
    int a;
    cin >> a;
    if (a == m) a = 0;
    mid2[i] = a;
    mid[a]++;
  }
  for (int i = 0; i < n; ++i) {
    cin >> fi[i];
    if (fi[i] == m) fi[i] = 0;
    fi[i] += mid2[i];
    if (fi[i] >= m) fi[i] -= m;
  }
  vector<long long> res;
  if (l > 2)
    res = ini * mpow(mid, l - 2);
  else
    res = ini;
  int ans = 0;
  for (int i = 0; i < n; ++i) {
    if (fi[i] == 0)
      ans += res[0];
    else
      ans += res[(m - fi[i])];
    if (ans >= mod) ans -= mod;
  }
  cout << ans << endl;
}
