#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e6 + 5;
long long dp[105], cnt[105], b[N], a[N];
void add(long long &a, long long b) {
  a += b;
  if (a >= mod) a -= mod;
}
struct Mat {
  long long t[101][101];
  Mat() { memset(t, 0, sizeof t); }
} I;
int m;
Mat operator*(Mat a, Mat b) {
  Mat c;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) {
      long long t = 0;
      for (int k = 0; k < m; k++) {
        add(c.t[i][j], a.t[i][k] * b.t[k][j] % mod);
      }
    }
  return c;
}
Mat Pow(Mat a, int b) {
  Mat c = I;
  while (b) {
    if (b & 1) c = c * a;
    a = a * a;
    b >>= 1;
  }
  return c;
}
int main() {
  int n, l, x;
  cin >> n >> l >> m;
  for (int i = 0; i < m; i++) dp[i] = 0, cnt[i] = 0;
  for (int i = 1; i <= n; i++) scanf("%d", &x), dp[x % m]++;
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), cnt[a[i] % m]++;
  for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
  for (int i = 0; i < m; i++) I.t[0][i] = dp[i];
  Mat pi;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) pi.t[i][j] = cnt[(m - i + j) % m];
  Mat ans = Pow(pi, l - 2);
  for (int i = 0; i < m; i++) cnt[i] = 0, dp[i] = 0;
  for (int i = 1; i <= n; i++) {
    cnt[(a[i] + b[i]) % m]++;
  }
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++)
      add(dp[(j + i) % m], ans.t[0][j] * cnt[i] % mod);
  printf("%lld\n", dp[0]);
}
