#include <bits/stdc++.h>
using namespace std;
int n, m, k, l1, l2, len, w, tot, di[505], d1[505], d2[505], fail[505],
    c[505][25], val[505], f[205][205][505][2];
void ins() {
  int o = 0;
  for (int i = (1); i <= (len); i++) {
    if (!c[o][di[i]]) c[o][di[i]] = ++tot;
    o = c[o][di[i]];
  }
  val[o] = (val[o] + w) % 1000000007;
}
void build() {
  queue<int> q;
  for (int i = (0); i <= (m - 1); i++)
    if (c[0][i]) q.push(c[0][i]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = (0); i <= (m - 1); i++)
      if (c[u][i]) {
        fail[c[u][i]] = c[fail[u]][i], q.push(c[u][i]);
        val[c[u][i]] += val[fail[c[u][i]]];
      } else
        c[u][i] = c[fail[u]][i];
  }
}
void upd(int &x, int y) {
  x += y;
  x -= x >= 1000000007 ? 1000000007 : 0;
}
int solve(int len, int di[], int typ = 0) {
  if (typ) {
    int now = len;
    while (!di[now]) di[now--] = m - 1;
    di[now]--;
    if (!di[1]) {
      len--;
      if (!len) return 0;
      for (int i = (1); i <= (len - 1); i++) di[i] = di[i + 1];
    }
  }
  int tmp;
  memset(f, 0, sizeof(f));
  for (int i = (1); i <= (di[1]); i++)
    if ((tmp = val[c[0][i]]) <= k) upd(f[1][c[0][i]][tmp][i == di[1]], 1);
  for (int i = (2); i <= (len); i++)
    for (int j = (1); j <= (m - 1); j++)
      if ((tmp = val[c[0][j]]) <= k) upd(f[i][c[0][j]][tmp][0], 1);
  for (int i = (1); i <= (len - 1); i++)
    for (int j = (0); j <= (tot); j++)
      for (int t = (0); t <= (k); t++)
        if (f[i][j][t][0] || f[i][j][t][1])
          for (int now = (0); now <= (m - 1); now++) {
            int nj = c[j][now];
            if (t + val[nj] > k) continue;
            upd(f[i + 1][nj][t + val[nj]][0], f[i][j][t][0]);
            if (now < di[i + 1])
              upd(f[i + 1][nj][t + val[nj]][0], f[i][j][t][1]);
            if (now == di[i + 1])
              upd(f[i + 1][nj][t + val[nj]][1], f[i][j][t][1]);
          }
  int ans = 0;
  for (int i = (0); i <= (tot); i++)
    for (int j = (0); j <= (k); j++)
      upd(ans, (f[len][i][j][0] + f[len][i][j][1]) % 1000000007);
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  scanf("%d", &l1);
  for (int i = (1); i <= (l1); i++) scanf("%d", &d1[i]);
  scanf("%d", &l2);
  for (int i = (1); i <= (l2); i++) scanf("%d", &d2[i]);
  for (int i = (1); i <= (n); i++) {
    scanf("%d", &len);
    for (int i = (1); i <= (len); i++) scanf("%d", &di[i]);
    scanf("%d", &w);
    ins();
  }
  build();
  cout << (solve(l2, d2) + 1000000007 - solve(l1, d1, 1)) % 1000000007;
  return 0;
}
