#include <bits/stdc++.h>
using namespace std;
void setIO(string St) {
  string IN = St + ".in", OUT = St + ".out";
  freopen(IN.c_str(), "r", stdin);
  freopen(OUT.c_str(), "w", stdout);
}
struct Trie {
  int v, sum, POS;
  Trie *s[23], *Fail;
} __DATA[208], *Root, *pt[208];
const int MOD = 1000000007;
int NowPOS;
int N, M, K, AL, AS[208], BL, BS[208];
int F[208][208][508][2], BF[208][208][508];
queue<Trie *> Que;
void BuildAC() {
  Root->Fail = Root;
  Que.push(Root);
  for (; !Que.empty();) {
    Trie *U = Que.front();
    Que.pop();
    for (int i = 0; i < M; i++)
      if (U->s[i]) {
        Que.push(U->s[i]);
        if (U == Root) {
          U->s[i]->Fail = Root;
          continue;
        }
        Trie *t = U->Fail;
        while (t != Root && !t->s[i]) t = t->Fail;
        if (t->s[i]) t = t->s[i];
        U->s[i]->Fail = t;
      }
  }
}
Trie *NewTrie() {
  Trie *t = __DATA + NowPOS;
  t->POS = NowPOS;
  pt[NowPOS++] = t;
  t->v = t->sum = 0;
  for (int i = 0; i < M; i++) t->s[i] = NULL;
  return t;
}
void Init() {
  scanf("%d%d%d", &N, &M, &K);
  scanf("%d", &AL);
  for (int i = 1; i <= AL; i++) scanf("%d", &AS[i]);
  scanf("%d", &BL);
  for (int i = 1; i <= BL; i++) scanf("%d", &BS[i]);
  Root = NewTrie();
  for (int k = 1; k <= N; k++) {
    int L1, V1, S1;
    scanf("%d", &L1);
    Trie *Now = Root;
    for (int i = 1; i <= L1; i++) {
      scanf("%d", &S1);
      if (Now->s[S1])
        Now = Now->s[S1];
      else {
        Trie *t = NewTrie();
        Now->s[S1] = t;
        Now = t;
      }
    }
    scanf("%d", &V1);
    Now->v += V1;
  }
}
Trie *GetNext(Trie *t, int m) {
  while (t != Root && !t->s[m]) t = t->Fail;
  if (t->s[m]) t = t->s[m];
  return t;
}
int L, P[208];
int DP() {
  memset(F, 0, sizeof(F));
  F[0][Root->POS][0][1] = 1;
  for (int i = 1; i <= L; i++)
    for (int j = 0; j < NowPOS; j++)
      for (int k = 0; k <= K; k++)
        for (int b = 0; b < 2; b++)
          if (F[i - 1][j][k][b])
            for (int m = 0; m < M; m++) {
              if (i == 1 && m == 0) continue;
              if (b && m > P[i]) break;
              bool b1 = (b && (m == P[i]));
              Trie *t = GetNext(pt[j], m);
              if (k + t->sum > K) continue;
              F[i][t->POS][k + t->sum][b1] += F[i - 1][j][k][b];
              F[i][t->POS][k + t->sum][b1] %= MOD;
            }
  int Ans = 0;
  for (int i = 1; i < L; i++)
    for (int j = 0; j < NowPOS; j++)
      for (int k = 0; k <= K; k++) Ans = (Ans + BF[i][j][k]) % MOD;
  for (int j = 0; j < NowPOS; j++)
    for (int k = 0; k <= K; k++)
      for (int b = 0; b < 2; b++) Ans = (Ans + F[L][j][k][b]) % MOD;
  return Ans;
}
void Solve() {
  int Ans1 = 0, Ans2 = 0;
  L = AL;
  for (int i = 1; i <= L; i++) P[i] = AS[i];
  if (L > 1 || P[1] != 0) {
    for (int i = L; i > 0; i--)
      if (P[i]) {
        P[i]--;
        for (int j = i + 1; j <= L; j++) P[j] = M - 1;
        break;
      }
    Ans1 = DP();
  } else {
    if (!Root->s[0] || Root->s[0]->sum <= K) Ans1 = -1;
  }
  L = BL;
  for (int i = 1; i <= L; i++) P[i] = BS[i];
  Ans2 = DP();
  cout << ((Ans2 - Ans1) % MOD + MOD) % MOD << endl;
}
int GoBack(Trie *t) {
  int Ans = 0;
  for (; t != Root; t = t->Fail) Ans += t->v;
  return Ans;
}
void BefDP() {
  for (int j = 0; j < NowPOS; j++) pt[j]->sum = GoBack(pt[j]);
  BF[0][0][0] = 1;
  for (int i = 1; i <= 200; i++)
    for (int j = 0; j < NowPOS; j++)
      for (int k = 0; k <= K; k++)
        if (BF[i - 1][j][k])
          for (int m = 0; m < M; m++) {
            if (i == 1 && m == 0) continue;
            Trie *t = GetNext(pt[j], m);
            if (k + t->sum <= K) {
              BF[i][t->POS][k + t->sum] += BF[i - 1][j][k];
              BF[i][t->POS][k + t->sum] %= MOD;
            }
          }
}
int main() {
  Init();
  BuildAC();
  BefDP();
  Solve();
  return 0;
}
