#include <bits/stdc++.h>
using namespace std;
void _fill_int(int* p, int val, int rep) {
  int i;
  for (i = 0; i < rep; i++) p[i] = val;
}
int N, M, K;
signed long long mo = 1000000007;
int L, R;
string LL, RR;
vector<string> S;
int V[201];
vector<vector<int> > TR;
vector<int> AC;
signed long long dpdp[2][201][501][2][2];
int find(string s) {
  int cur = 0;
  for (__typeof(s.begin()) it = s.begin(); it != s.end(); it++)
    if ((cur = TR[cur][*it]) == 0) return -1;
  return cur;
}
void create(vector<string> S) {
  int i;
  TR.push_back(vector<int>(256));
  for (__typeof(S.begin()) it = S.begin(); it != S.end(); it++) {
    int cur = 0;
    for (__typeof((*it).begin()) c = (*it).begin(); c != (*it).end(); c++) {
      if (TR[cur][*c] == 0)
        TR.push_back(vector<int>(256)), TR[cur][*c] = TR.size() - 1;
      cur = TR[cur][*c];
    }
    AC.resize(TR.size());
    AC[cur] += V[it - S.begin()];
  }
  queue<int> Q;
  for (i = 0; i < 255; i++)
    if (TR[0][i]) TR[TR[0][i]][255] = 0, Q.push(TR[0][i]);
  while (!Q.empty()) {
    int k = Q.front();
    Q.pop();
    for (i = 0; i < 255; i++)
      if (TR[k][i]) {
        Q.push(TR[k][i]);
        int pre = TR[k][255];
        while (pre != 0 && TR[pre][i] == 0) pre = TR[pre][255];
        TR[TR[k][i]][255] = TR[pre][i];
        AC[TR[k][i]] += AC[TR[pre][i]];
      }
  }
}
signed long long dodo(string SS) {
  signed long long ret = 0, rr;
  int i, j, k, x, y, pos, val, b1, b2;
  memset(dpdp, 0, sizeof(dpdp));
  dpdp[0][0][0][1][1] = 1;
  for (i = 0; i < SS.size(); i++) {
    int cur = i % 2, tar = cur ^ 1;
    memset(dpdp[tar], 0, sizeof(dpdp[tar]));
    for (b1 = 0; b1 < 2; b1++)
      for (b2 = 0; b2 < 2; b2++)
        for (val = 0; val < K + 1; val++)
          for (pos = 0; pos < TR.size(); pos++)
            if ((rr = dpdp[cur][pos][val][b1][b2])) {
              for (j = 0; j < M; j++) {
                if (b1 && j > SS[i]) break;
                y = (b1 && j == SS[i]);
                if (b2 && (j == 0)) {
                  dpdp[tar][pos][val][y][1] += rr;
                  dpdp[tar][pos][val][y][1] %= mo;
                  continue;
                }
                x = pos;
                while (x && TR[x][j] == 0) x = TR[x][255];
                x = TR[x][j];
                if (val + AC[x] <= K) {
                  dpdp[tar][x][val + AC[x]][y][0] += rr;
                  dpdp[tar][x][val + AC[x]][y][0] %= mo;
                }
              }
            }
  }
  x = SS.size() % 2;
  for (i = 0; i < 201; i++)
    for (j = 0; j < K + 1; j++)
      ret += dpdp[x][i][j][0][0] + dpdp[x][i][j][0][1] + dpdp[x][i][j][1][0] +
             dpdp[x][i][j][1][1];
  return ret % mo;
}
void solve() {
  int f, i, j, k, l, x, y;
  cin >> N >> M >> K;
  cin >> L;
  for (i = 0; i < L; i++) cin >> x, LL += x;
  cin >> R;
  for (i = 0; i < R; i++) cin >> x, RR += x;
  for (i = 0; i < N; i++) {
    cin >> j;
    string s;
    while (j--) cin >> x, s += x;
    S.push_back(s);
    cin >> V[i];
  }
  create(S);
  i = LL.size() - 1;
  LL[i] -= 1;
  while (LL[i] < 0) LL[i] += M, LL[--i] -= 1;
  while (LL.size() > 0 && LL[0] == 0) LL.erase(LL.begin());
  cout << (dodo(RR) - dodo(LL) + mo) % mo << endl;
}
int main(int argc, char** argv) {
  string s;
  if (argc == 1) ios::sync_with_stdio(false);
  for (int i = 1; i < argc; i++) s += argv[i], s += '\n';
  for (int i = s.size() - 1; i >= 0; i--) ungetc(s[i], stdin);
  solve();
  return 0;
}
