#include <bits/stdc++.h>   #pragma GCC optimize( O3 )   using namespace std;   inline long long getint() {     long long _x = 0, _tmp = 1;     char _tc = getchar();     while ((_tc <  0  || _tc >  9 ) && _tc !=  - ) _tc = getchar();     if (_tc ==  - ) _tc = getchar(), _tmp = -1;     while (_tc >=  0  && _tc <=  9 ) _x *= 10, _x += (_tc -  0 ), _tc = getchar();     return _x * _tmp;   }   inline long long add(long long _x, long long _y,                        long long _mod = 1000000007LL) {     _x += _y;     return _x >= _mod ? _x - _mod : _x;   }   inline long long sub(long long _x, long long _y,                        long long _mod = 1000000007LL) {     _x -= _y;     return _x < 0 ? _x + _mod : _x;   }   inline long long mul(long long _x, long long _y,                        long long _mod = 1000000007LL) {     _x *= _y;     return _x >= _mod ? _x % _mod : _x;   }   long long mypow(long long _a, long long _x, long long _mod) {     if (_x == 0) return 1LL;     long long _ret = mypow(mul(_a, _a, _mod), _x >> 1, _mod);     if (_x & 1) _ret = mul(_ret, _a, _mod);     return _ret;   }   long long mymul(long long _a, long long _x, long long _mod) {     if (_x == 0) return 0LL;     long long _ret = mymul(add(_a, _a, _mod), _x >> 1, _mod);     if (_x & 1) _ret = add(_ret, _a, _mod);     return _ret;   }   inline bool equal(double _x, double _y) {     return _x > _y - 1e-9 && _x < _y + 1e-9;   }   int __ = 1, _cs;   struct Mat {     int n, a[101][101];     Mat(int _n) {       n = _n;       for (int i = 0; i < n; i++)         for (int j = 0; j < n; j++) a[i][j] = 0;     }     Mat operator*(const Mat& he) const {       Mat ret(n);       for (int i = 0; i < n; i++)         for (int j = 0; j < n; j++)           for (int k = 0; k < n; k++)             ret.a[i][j] = add(ret.a[i][j], mul(a[i][k], he.a[k][j]));       return ret;     }     Mat operator^(int tms) const {       Mat ret(n), tmp(n);       for (int i = 0; i < n; i++) {         ret.a[i][i] = 1;         for (int j = 0; j < n; j++) tmp.a[i][j] = a[i][j];       }       while (tms > 0) {         if (tms & 1) ret = ret * tmp;         tmp = tmp * tmp;         tms >>= 1;       }       return ret;     }   };   void build() {}   int n, l, m, s[1010101], u[1010101], o[1010101];   void init() {     n = getint();     l = getint();     m = getint();     for (int i = 0; i < n; i++) s[i] = getint();     for (int i = 0; i < n; i++) u[i] = getint();     for (int i = 0; i < n; i++) o[i] = getint();   }   int cnt[111], sc[111], oc[111][111];   void solve() {     Mat tmp(m);     for (int i = 0; i < n; i++) cnt[u[i] % m]++;     for (int i = 0; i < m; i++)       for (int j = 0; j < m; j++) {         int dlt = (i - j + m) % m;         tmp.a[i][j] = cnt[dlt];       }     for (int i = 0; i < n; i++) sc[s[i] % m]++;     for (int i = 0; i < n; i++) oc[u[i] % m][o[i] % m]++;     tmp = tmp ^ (l - 2);     int ans = 0;     for (int i = 0; i < m; i++)       if (sc[i])         for (int j = 0; j < m; j++)           for (int k = 0; k < m; k++) {             if (oc[j][k] == 0) continue;             int tar = (m - (i + j + k) % m) % m;             ans = add(ans, mul(sc[i], mul(oc[j][k], tmp.a[tar][0])));           }     printf( %d n , ans);   }   int main() {     build();     while (__--) {       init();       solve();     }   }