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