#include <bits/stdc++.h>
using namespace std;
inline int get_int() {
  int res, t = 1;
  char c;
  while (!isdigit(c = getchar()))
    if (c == '-') t = -1;
  for (res = c - '0'; isdigit(c = getchar());) res = res * 10 + c - '0';
  return res * t;
}
const int MAXN = 200;
const int MAXL = 200;
const int MAXK = 500;
const int MOD = 1000000000 + 7;
int n, SIGMA, K;
struct acm {
  int ch[MAXN + 10][20], sz;
  int root;
  int val[MAXN + 10];
  int f[MAXN + 10];
  void init() {
    sz = 1;
    root = newnode();
  }
  int newnode() { return sz++; }
  void ins(int *s, int len, int v) {
    int u = root;
    for (int i = 0; i < len; i++) {
      int c = s[i];
      if (ch[u][c] == 0) ch[u][c] = newnode();
      u = ch[u][c];
    }
    val[u] += v;
  }
  void getfail() {
    queue<int> q;
    f[root] = root;
    for (int i = 0; i < SIGMA; i++) {
      int &v = ch[root][i];
      if (!v) {
        v = root;
      } else {
        q.push(v);
        f[v] = root;
      }
    }
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int i = 0; i < SIGMA; i++) {
        int &v = ch[u][i];
        if (!v) {
          v = ch[f[u]][i];
        } else {
          q.push(v);
          f[v] = ch[f[u]][i];
          val[v] += val[f[v]];
        }
      }
    }
  }
  int dp[MAXN + 10][MAXL + 10][MAXK + 10], tmplen;
  int dfs(int u, int len, int K, int *buf, bool limit) {
    if (val[u] > K) return 0;
    if (len == 0) return 1;
    if (dp[u][len][K] != -1 && !limit) return dp[u][len][K];
    int ans = 0;
    int UP = limit ? *buf : SIGMA;
    for (int i = len == tmplen ? 1 : 0; i < UP; i++) {
      int v = ch[u][i];
      (ans += dfs(v, len - 1, K - val[u], buf + 1, 0)) %= MOD;
    }
    if (limit && len != 1)
      (ans += dfs(ch[u][UP], len - 1, K - val[u], buf + 1, 1)) %= MOD;
    if (!limit) {
      dp[u][len][K] = ans;
      if (tmplen == len)
        (dp[u][len][K] += dfs(ch[u][0], len - 1, K - val[u], buf + 1, 0)) %=
            MOD;
    }
    return ans;
  }
} sp;
int L[MAXN + 10], R[MAXN + 10];
int buf[MAXN + 10];
int main() {
  sp.init();
  n = get_int();
  SIGMA = get_int();
  K = get_int();
  L[0] = get_int();
  for (int i = 1; i <= L[0]; i++) {
    L[i] = get_int();
  }
  R[0] = get_int();
  for (int i = R[0]; i >= 1; i--) {
    R[i] = get_int();
  }
  R[1]++;
  for (int i = 1; i <= R[0]; i++) {
    R[i + 1] += R[i] / SIGMA;
    R[i] %= SIGMA;
    if (R[R[0] + 1]) R[0]++;
  }
  reverse(R + 1, R + 1 + R[0]);
  for (int i = 1; i <= n; i++) {
    int len = get_int();
    for (int j = 0; j < len; j++) buf[j] = get_int();
    sp.ins(buf, len, get_int());
  }
  sp.getfail();
  long long ans = 0;
  memset(sp.dp, -1, sizeof(sp.dp));
  for (int l = 1; l <= R[0]; l++) {
    sp.tmplen = l;
    ans = (ans + sp.dfs(1, l, K, R + 1, l == R[0])) % MOD;
  }
  memset(sp.dp, -1, sizeof(sp.dp));
  for (int l = 1; l <= L[0]; l++) {
    sp.tmplen = l;
    ans = (ans - sp.dfs(1, l, K, L + 1, l == L[0])) % MOD;
  }
  ans = (ans + MOD) % MOD;
  cout << ans << endl;
  return 0;
}
