#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int l[220], nl;
int r[220], nr;
vector<int> a[220];
int v[220];
int z1[220][220];
int t[220];
int cal(int x, int y, int z, int x1) {
  for (int i = 0; i <= y; i++) {
    t[i] = a[x][i];
  }
  t[y + 1] = z;
  for (int j = max(0, -(int)a[x1].size() + (y + 2)); j <= y + 1; j++) {
    bool b = 1;
    for (int i = 0; i < a[x1].size() && j + i <= y + 1; i++) {
      if (a[x1][i] != t[j + i]) {
        b = 0;
        break;
      }
    }
    if (b) {
      return y + 1 - j;
    }
  }
  return -1e9;
}
int go[220][22];
int v1[220][22];
int dp[2][201][501][2][2][2];
int k1;
int f(int i, int j, int k2, bool up, bool lw, bool b) {
  bool b3 = 0;
  for (int j = 0; j < k1; j++) {
    for (int k1 = 0; k1 <= k; k1++) {
      for (int up = 0; up < 2; up++) {
        for (int lw = 0; lw < 2; lw++) {
          for (int b = 0; b < 2; b++) {
            dp[0][j][k1][up][lw][b] = 1;
          }
        }
      }
    }
  }
  for (int i = nr - 1; i >= 0; i--) {
    b3 = !b3;
    for (int j = 0; j < k1; j++) {
      for (int k2 = 0; k2 <= k; k2++) {
        for (int up = 0; up < 2; up++) {
          for (int lw = 0; lw < 2; lw++) {
            for (int b = 0; b < 2; b++) {
              long long r1 = 0;
              int st = l[i];
              int en = r[i];
              if (up) en = m - 1;
              if (lw) st = 0;
              int v2 = 0;
              for (int j1 = st; j1 <= en; j1++) {
                bool up1 = up | (j1 < r[i]);
                bool lw1 = lw | (j1 > l[i]);
                v2 = v1[j][j1];
                if (j1 == 0 && !b)
                  r1 += dp[!b3][0][k2][up1][lw1][0];
                else if (k2 + v2 <= k)
                  r1 += dp[!b3][go[j][j1]][k2 + v2][up1][lw1][b | (j1 != 0)];
              }
              r1 %= 1000000007;
              dp[b3][j][k2][up][lw][b] = r1;
            }
          }
        }
      }
    }
  }
  return dp[b3][0][0][0][0][0];
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> m >> k;
  cin >> nl;
  for (int i = 0; i < nl; i++) cin >> l[i];
  cin >> nr;
  for (int i = 0; i < nr; i++) cin >> r[i];
  k1 = nl - 1;
  int x;
  for (int i = nr - 1; i >= 0; i--) {
    if (k1 >= 0)
      l[i] = l[k1--];
    else
      l[i] = 0;
  }
  for (int i = 0; i < n; i++) {
    cin >> k1;
    while (k1--) {
      cin >> x;
      a[i].push_back(x);
    }
    cin >> v[i];
  }
  k1 = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < a[i].size(); j++) {
      z1[i][j] = k1++;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < a[i].size(); j++) {
      for (int j1 = 0; j1 < m; j1++) {
        pair<int, int> mx = make_pair(-1e9, 0);
        for (int i1 = 0; i1 < n; i1++) {
          int r = cal(i, j, j1, i1);
          mx = max(mx, make_pair(r, i1));
          if (r == a[i1].size() - 1) {
            v1[z1[i][j]][j1] += v[i1];
          }
        }
        if (mx.first >= 0) {
          go[z1[i][j]][j1] = z1[mx.second][mx.first];
        }
      }
    }
  }
  for (int j1 = 0; j1 < m; j1++) {
    for (int i = 0; i < n; i++) {
      if (a[i][0] == j1) {
        go[0][j1] = z1[i][0];
        if (0 == a[i].size() - 1) v1[0][j1] += v[i];
      }
    }
  }
  cout << f(0, 0, 0, 0, 0, 0);
  return 0;
}
