#include <bits/stdc++.h>
using namespace std;
char _;
const int maxN = 200 + 15;
const int maxM = 100 * 100 + 5;
const int mod = 1000 * 1000 * 1000 + 7;
const int base = 701;
const int SQ = 500;
const int maxL = 17;
int s[maxN][maxN];
int len[maxN], val[maxN];
int L[maxN], R[maxN], Llen, Rlen;
int c[maxN][20], h[maxN], f[maxN], v[maxN], ch[maxN], par[maxN], cnt = 1;
vector<int> g[maxN];
int n, m, k;
void make_aho() {
  vector<pair<int, int> > x;
  for (int i = 1; i < cnt; i++) x.push_back({h[i], i});
  sort(x.begin(), x.end());
  for (int i = 0; i < m; i++)
    if (c[0][i] == -1) c[0][i] = 0;
  for (auto it : x) {
    int cur = it.second;
    if (h[cur] > 1) f[cur] = c[f[par[cur]]][ch[cur]];
    g[f[cur]].push_back(cur);
    for (int i = 0; i < m; i++)
      if (c[cur][i] == -1) c[cur][i] = c[f[cur]][i];
  }
}
void dfs(int vv) {
  for (auto u : g[vv]) {
    v[u] += v[vv];
    dfs(u);
  }
}
int dp[maxN][2][maxN][502];
int T[maxN], tlen;
int get() {
  if (tlen == 0) return 0;
  for (int i = 1; i < T[0] + 1; i++) dp[1][(T[0] == i)][c[0][i]][v[c[0][i]]]++;
  for (int i = 2; i < tlen + 1; i++) {
    int cc = T[i - 1];
    for (int j = 0; j < cnt; j++)
      for (int arz = 0; arz < k + 1; arz++)
        for (int las = 0; las < m; las++) {
          int now = c[j][las];
          if (arz + v[now] <= k) {
            dp[i][0][now][arz + v[now]] += dp[i - 1][0][j][arz];
            if (las < cc) dp[i][0][now][arz + v[now]] += dp[i - 1][1][j][arz];
            if (las == cc) dp[i][1][now][arz + v[now]] += dp[i - 1][1][j][arz];
          }
          dp[i][0][now][arz + v[now]] %= mod;
          dp[i][1][now][arz + v[now]] %= mod;
        }
    for (int j = 1; j < m; j++) dp[i][0][c[0][j]][v[c[0][j]]]++;
  }
  int ans = 0;
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < cnt; j++)
      for (int arz = 0; arz < k + 1; arz++)
        ans = (ans + dp[tlen][i][j][arz]) % mod;
  return ans;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k;
  cin >> Llen;
  for (int i = 0; i < Llen; i++) cin >> L[i];
  reverse(L, L + Llen);
  L[0]--;
  for (int i = 0; i < Llen; i++)
    if (L[i] < 0) {
      L[i] += m;
      L[i + 1]--;
    }
  while (Llen && L[Llen - 1] == 0) Llen--;
  reverse(L, L + Llen);
  cin >> Rlen;
  for (int i = 0; i < Rlen; i++) cin >> R[i];
  for (int i = 0; i < n; i++) {
    cin >> len[i];
    for (int j = 0; j < len[i]; j++) cin >> s[i][j];
    cin >> val[i];
  }
  memset(c, -1, sizeof c);
  for (int i = 0; i < n; i++) {
    int cur = 0;
    for (int j = 0; j < len[i]; j++) {
      if (c[cur][s[i][j]] == -1) {
        par[cnt] = cur;
        h[cnt] = h[cur] + 1;
        ch[cnt] = s[i][j];
        c[cur][s[i][j]] = cnt++;
      }
      cur = c[cur][s[i][j]];
    }
    v[cur] += val[i];
  }
  make_aho();
  dfs(0);
  int bozorg = 0, kochik = 0;
  tlen = Rlen;
  for (int i = 0; i < Rlen; i++) T[i] = R[i];
  bozorg = get();
  memset(dp, 0, sizeof dp);
  tlen = Llen;
  for (int i = 0; i < Llen; i++) T[i] = L[i];
  kochik = get();
  cout << (bozorg + mod - kochik) % mod << endl;
  return 0;
}
