#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;   }