#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const double PI = atan(1.0) * 4;
const int inf = 2147483647 / 2;
const int maxn = 207;
const int maxs = 20;
const int mod = 1000000007;
template <class T>
bool chmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool chmax(T &a, const T &b) {
  return b > a ? a = b, 1 : 0;
}
template <class T>
int sgn(T first) {
  return (first > eps) - (first < -eps);
}
int M, K;
int dig_l[205], dig_r[205];
int d[205][205][505];
inline void add(int &a, int b) {
  a += b;
  if (a >= mod) a -= mod;
}
struct nod {
  nod *ch[maxs], *f;
  nod *jump[maxs];
  int v;
  nod *go(int c);
} * bat;
nod *nod::go(int c) {
  if (ch[c] == 0)
    ch[c] = bat++, memset(ch[c]->ch, 0, sizeof(ch[c]->ch)), ch[c]->v = 0;
  return ch[c];
}
struct AC {
  nod an[maxn], *rt, *q[maxn];
  void newnod(nod *&o) {
    o = bat++;
    memset(o->ch, 0, sizeof(o->ch));
    o->v = 0;
  }
  void init() {
    bat = an;
    newnod(rt);
  }
  int idx(nod *first) { return first - an; }
  void insert(int *s, int n, int v) {
    nod *first = rt;
    for (int i = (0); i <= (int)(n - 1); i++) first = first->go(s[i]);
    first->v += v;
  }
  void build() {
    int ql = 0, qr = 0;
    q[qr++] = rt;
    while (ql != qr) {
      nod *first = q[ql++];
      for (int c = (0); c <= (int)(maxs - 1); c++) {
        nod *v = first->ch[c];
        if (!v) continue;
        nod *last = first->f;
        while (last && last->ch[c] == 0) last = last->f;
        if (last)
          v->f = last->ch[c];
        else
          v->f = rt;
        q[qr++] = v;
      }
    }
    for (int i = (0); i <= (int)(maxs - 1); i++)
      rt->jump[i] = rt->ch[i] ? rt->ch[i] : rt;
    for (int i = (1); i <= (int)(qr - 1); i++) {
      nod *first = q[i];
      for (int j = (0); j <= (int)(maxs - 1); j++)
        if (first->ch[j])
          first->jump[j] = first->ch[j];
        else
          first->jump[j] = first->f->jump[j];
    }
    for (int i = (0); i <= (int)(qr - 1); i++) {
      nod *first = q[i];
      if (first->f) first->v += first->f->v;
    }
  }
  int dfs(int p, nod *u, int k, bool first, bool sl, bool sr) {
    if (p == -1) return 1;
    int safe = !(sl || sr);
    int s = idx(u);
    if (safe && ~d[p][s][k]) return d[p][s][k];
    int ret = 0;
    for (int i = (0); i <= (int)(M - 1); i++) {
      if (sl && i < dig_l[p]) continue;
      if (sr && i > dig_r[p]) continue;
      nod *v = u;
      if (!first || i) v = u->jump[i];
      if (k + v->v <= K)
        add(ret, dfs(p - 1, v, k + v->v, first && (!i), sl && i == dig_l[p],
                     sr && i == dig_r[p]));
    }
    return safe ? d[p][s][k] = ret : ret;
  }
} gao;
int td[205];
int main() {
  int n;
  while (~scanf("%d%d%d", &n, &M, &K)) {
    int l1, l2;
    scanf("%d", &l1);
    for (int i = (l1 - 1); i >= (int)(0); i--) scanf("%d", dig_l + i);
    scanf("%d", &l2);
    for (int i = (l2 - 1); i >= (int)(0); i--) scanf("%d", dig_r + i);
    while (l1 < l2) dig_l[l1++] = 0;
    gao.init();
    for (int i = (0); i <= (int)(n - 1); i++) {
      int l, val;
      scanf("%d", &l);
      for (int j = (0); j <= (int)(l - 1); j++) scanf("%d", td + j);
      scanf("%d", &val);
      gao.insert(td, l, val);
    }
    gao.build();
    memset(d, -1, sizeof(d));
    printf("%d\n", gao.dfs(l2 - 1, gao.rt, 0, 1, 1, 1));
  }
  return 0;
}
