#include <bits/stdc++.h>
#pragma comment(linker, "/stack:16777216")
using namespace std;
const int INF = 1000000000;
const int MAX = 512;
const int MAX2 = 7000;
const int BASE = 1000000007;
int n, m, k, cnt;
vector<int> L;
vector<int> R;
vector<int> A[MAX];
int W[MAX];
vector<int> P[MAX];
vector<int> Q[MAX];
long long Pow[MAX];
long long PH[MAX];
long long TH[MAX];
long long AH[MAX];
int Next[MAX][32];
int Add[MAX];
int Res[2][2][2][207][507][2];
bool Cmp(vector<int> A, vector<int> B) {
  return ((int)A.size() < (int)B.size());
}
int main() {
  Pow[0] = 1;
  for (int i = (1); i < (MAX); ++i) Pow[i] = Pow[i - 1] * BASE;
  scanf("%d %d %d", &n, &m, &k);
  int len;
  scanf("%d", &len);
  for (int i = (0); i < (len); ++i) {
    int x;
    scanf("%d", &x);
    L.push_back(x);
  }
  scanf("%d", &len);
  for (int i = (0); i < (len); ++i) {
    int x;
    scanf("%d", &x);
    R.push_back(x);
  }
  reverse(L.begin(), L.end());
  reverse(R.begin(), R.end());
  len = max((int)L.size(), (int)R.size());
  while ((int)L.size() < len) L.push_back(0);
  while ((int)R.size() < len) R.push_back(0);
  reverse(L.begin(), L.end());
  reverse(R.begin(), R.end());
  cnt = 1;
  for (int i = (0); i < (n); ++i) {
    scanf("%d", &len);
    for (int j = (0); j < (len); ++j) {
      int x;
      scanf("%d", &x);
      A[i].push_back(x);
    }
    scanf("%d", &W[i]);
    vector<int> T;
    AH[i] = 0;
    for (int j = (0); j < ((int)A[i].size()); ++j) {
      T.push_back(A[i][j]);
      P[cnt++] = T;
      AH[i] += Pow[j] * A[i][j];
    }
  }
  sort(P, P + cnt, Cmp);
  for (int i = (0); i < (cnt); ++i) {
    for (int j = (0); j < ((int)P[i].size()); ++j) PH[i] += Pow[j] * P[i][j];
  }
  for (int i = (0); i < (cnt); ++i)
    for (int c = (0); c < (m); ++c) {
      vector<int> T;
      T = P[i];
      T.push_back(c);
      TH[0] = T[0];
      for (int j = (1); j < ((int)T.size()); ++j)
        TH[j] = TH[j - 1] + Pow[j] * T[j];
      Next[i][c] = 0;
      for (int j = (1); j < (cnt); ++j) {
        if ((int)P[j].size() > (int)T.size()) break;
        int pos = (int)T.size() - (int)P[j].size();
        long long h1 = TH[(int)T.size() - 1] - (pos == 0 ? 0 : TH[pos - 1]);
        long long h2 = PH[j] * Pow[pos];
        if (h1 == h2) Next[i][c] = j;
      }
    }
  for (int i = (1); i < (cnt); ++i) {
    Add[i] = 0;
    vector<int> T = P[i];
    TH[0] = T[0];
    for (int j = (1); j < ((int)T.size()); ++j)
      TH[j] = TH[j - 1] + Pow[j] * T[j];
    for (int j = (0); j < (n); ++j) {
      if ((int)A[j].size() > (int)T.size()) continue;
      int pos = (int)T.size() - (int)A[j].size();
      long long h1 = TH[(int)T.size() - 1] - (pos == 0 ? 0 : TH[pos - 1]);
      long long h2 = AH[j] * Pow[pos];
      if (h1 == h2) Add[i] += W[j];
    }
  }
  int cur = 0, next = 1;
  Res[cur][1][1][0][0][0] = 1;
  for (int i = (0); i < ((int)L.size()); ++i) {
    for (int bl = (0); bl < (2); ++bl)
      for (int br = (0); br < (2); ++br)
        for (int p = (0); p < (cnt); ++p)
          for (int sum = (0); sum < (k + 1); ++sum)
            for (int was = (0); was < (2); ++was)
              Res[next][bl][br][p][sum][was] = 0;
    for (int bl = (0); bl < (2); ++bl)
      for (int br = (0); br < (2); ++br)
        for (int p = (0); p < (cnt); ++p)
          for (int sum = (0); sum < (k + 1); ++sum)
            for (int was = (0); was < (2); ++was) {
              int val = Res[cur][bl][br][p][sum][was];
              if (val == 0) continue;
              for (int d = (0); d < (m); ++d) {
                int bl2, br2, p2;
                if (bl == 1 && d < L[i]) continue;
                if (br == 1 && d > R[i]) continue;
                bl2 = bl;
                br2 = br;
                if (bl == 1 && d > L[i]) bl2 = 0;
                if (br == 1 && d < R[i]) br2 = 0;
                p2 = Next[p][d];
                int add = Add[p2];
                int was2 = (was | (d > 0));
                if (was2 == 0) {
                  p2 = 0;
                  add = 0;
                }
                if (sum + add <= k) {
                  Res[next][bl2][br2][p2][sum + add][was2] += val;
                  if (Res[next][bl2][br2][p2][sum + add][was2] >= 1000000007)
                    Res[next][bl2][br2][p2][sum + add][was2] -= 1000000007;
                }
              }
            }
    swap(cur, next);
  }
  int res = 0;
  for (int bl = (0); bl < (2); ++bl)
    for (int br = (0); br < (2); ++br)
      for (int p = (0); p < (cnt); ++p)
        for (int sum = (0); sum < (k + 1); ++sum) {
          res += Res[cur][bl][br][p][sum][1];
          res %= 1000000007;
        }
  printf("%d\n", res);
  return 0;
}
