#include <bits/stdc++.h>
using namespace std;
bool chmin(int& a, int b) { return b < a ? a = b, true : false; }
bool chmax(int& a, int b) { return b > a ? a = b, true : false; }
bool chmin(long long& a, long long b) { return b < a ? a = b, true : false; }
bool chmax(long long& a, long long b) { return b > a ? a = b, true : false; }
const int inf = 1e09 + 5e3;
const long long linf = 2e18 + 5e3;
const int mod = 1e9 + 7;
const int mxn = 1e5 + 30;
struct matrix {
  vector<vector<long long> > mat;
  int r, c;
  matrix(int r = 2, int c = 2) {
    this->r = r;
    this->c = c;
    mat.assign(r, vector<long long>(c));
  }
  matrix(int r, int c, long long val) {
    this->r = r;
    this->c = c;
    mat.assign(r, vector<long long>(c, val));
  }
  matrix(vector<vector<long long> > ini) {
    r = ini.size();
    c = ini[0].size();
    mat = ini;
  }
  void one() {
    mat.assign(r, vector<long long>(c));
    for (int i = 0; i < r && i < c; i++) mat[i][i] = 1;
  }
  matrix operator*(matrix& b) {
    assert(this->c == b.r);
    matrix ret = matrix(this->r, b.c);
    for (int i = 0; i < r; i++)
      for (int j = 0; j < b.c; j++)
        for (int k = 0; k < b.r; k++)
          ret[i][j] += this->mat[i][k] * b[k][j], ret[i][j] %= mod;
    return ret;
  }
  void operator*=(matrix& b) {
    assert(this->c == b.r);
    vector<vector<long long> > ret(this->r, vector<long long>(b.c));
    for (int i = 0; i < r; i++)
      for (int j = 0; j < b.c; j++)
        for (int k = 0; k < b.r; k++)
          ret[i][j] += this->mat[i][k] * b[k][j], ret[i][j] %= mod;
    swap(this->mat, ret);
    this->c = b.c;
  }
  vector<long long>& operator[](int a) { return mat[a]; }
  matrix operator^(long long n) {
    assert(r == c);
    matrix ret = matrix(this->r, this->c);
    ret.one();
    matrix cur = *this;
    while (n) {
      if (n & 1) ret *= cur;
      cur *= cur;
      n >>= 1;
    }
    return ret;
  }
  void operator^=(long long n) {
    matrix cur = *this;
    this->one();
    while (n) {
      if (n & 1) *this *= cur;
      cur *= cur;
      n >>= 1;
    }
  }
  void operator=(vector<vector<long long> > ini) {
    r = ini.size();
    c = ini[0].size();
    mat = ini;
  }
};
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  long long n, l, m, temp;
  map<int, int> ma;
  cin >> n >> l >> m;
  matrix start = matrix(1, m), t = matrix(m, m), end = matrix(m, m);
  for (int i = 0; i < n; i++) {
    cin >> temp;
    temp %= m;
    start[0][temp]++;
  }
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    cin >> temp;
    a[i] += temp;
    ma[temp % m]++;
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      t[j][(j + i) % m] += ma[i];
    }
  }
  ma.clear();
  for (int i = 0; i < n; i++) {
    cin >> temp;
    a[i] += temp;
    a[i] %= m;
    ma[a[i]]++;
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      end[j][(j + i) % m] += ma[i];
    }
  }
  t ^= l - 2;
  start *= t;
  start *= end;
  cout << start[0][0];
}
