#include <bits/stdc++.h>
using namespace std;
int a[1000100], b[1000100], c[1000100], m;
struct poly {
  int a[100];
  poly() { memset(a, 0, sizeof(a)); }
};
poly operator*(poly a, poly b) {
  poly c;
  for (int i = 0; i < m; ++i) {
    for (int j = 0; j < m; ++j) {
      if (i + j < m) {
        c.a[i + j] += (a.a[i] * 1LL * b.a[j]) % 1000000007;
        c.a[i + j] %= 1000000007;
      } else {
        c.a[i + j - m] += (a.a[i] * 1LL * b.a[j]) % 1000000007;
        c.a[i + j - m] %= 1000000007;
      }
    }
  }
  return c;
}
poly exp(poly a, int l) {
  if (l == 0) {
    poly z;
    z.a[0] = 1;
    return z;
  }
  if (l & 1) return a * exp(a, l - 1);
  return exp(a * a, (l >> 1));
}
int main() {
  int n, l;
  scanf("%d", &n);
  scanf("%d", &l);
  scanf("%d", &m);
  poly first, sec, third;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
    a[i] %= m;
    ++first.a[a[i]];
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &b[i]);
    b[i] %= m;
    ++sec.a[b[i]];
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &c[i]);
    c[i] = (b[i] + c[i]) % m;
    ++third.a[c[i]];
  }
  poly ans = first * exp(sec, l - 2) * third;
  printf("%d\n", ans.a[0]);
}
