#include <bits/stdc++.h>
using namespace std;
struct bignum {
  int len;
  int num[201];
} L, R;
int n, m, K;
int n1, AA[201];
void getnum(bignum &b) {
  int len;
  scanf("%d", &b.len);
  for (int i = 200 - b.len + 1; i <= 200; ++i) scanf("%d", &b.num[i]);
}
int f[201][201], mark[201], tot;
void build(int x, int vi, int p) {
  if (p > n1) {
    mark[x] += vi;
    return;
  }
  int c = f[x][AA[p]];
  if (c == 0) c = f[x][AA[p]] = ++tot;
  build(c, vi, p + 1);
}
queue<int> que;
int fail[201];
void calc_fail() {
  que.push(0);
  memset(fail, -1, sizeof(fail));
  while (!que.empty()) {
    int x = que.front();
    que.pop();
    for (int i = 0; i < m; ++i) {
      if (!f[x][i]) continue;
      int y = fail[x];
      while (y != -1 && f[y][i] == 0) y = fail[y];
      if (y == -1)
        fail[f[x][i]] = 0;
      else
        fail[f[x][i]] = f[y][i];
      que.push(f[x][i]);
    }
  }
}
int bo[201];
int dfs(int x) {
  if (x == -1) return 0;
  if (bo[x]) return mark[x];
  mark[x] += dfs(fail[x]);
  bo[x] = 1;
  return mark[x];
}
int dp[2][201][201][502];
const int p = 1000000007;
int dpsolve(const bignum &a, int m1) {
  dp[1][0][0][0] = 0;
  memset(dp, 0, sizeof(dp));
  for (int i = 0; i <= 200; ++i) {
    if (i >= 200 - a.len + 1)
      for (int j = 1; j < m; ++j) {
        int y = f[0][j];
        if (mark[y] > K) continue;
        int k = mark[y];
        int x = 0;
        if (i == 200 - a.len + 1) {
          if (j > a.num[i]) break;
          if (j == a.num[i]) x = 1;
        }
        dp[x][i][y][k] = (dp[x][i][y][k] + 1) % p;
      }
    if (i == 200) break;
    for (int j = 0; j <= tot; ++j)
      for (int k = 0; k <= K; ++k)
        for (int x = 0; x < 2; ++x) {
          if (!dp[x][i][j][k]) continue;
          for (int l = 0; l < m; ++l) {
            if (x == 1 && l > a.num[i + 1]) continue;
            int y = j;
            while (y != -1 && f[y][l] == 0) y = fail[y];
            if (y == -1)
              y = 0;
            else
              y = f[y][l];
            int x1 = x, k1 = k + mark[y];
            if (x == 1 && l < a.num[i + 1]) x1 = 0;
            if (k1 > K) continue;
            dp[x1][i + 1][y][k1] = (dp[x1][i + 1][y][k1] + dp[x][i][j][k]) % p;
          }
        }
  }
  int ans = 0;
  for (int i = 0; i <= tot; ++i)
    for (int j = 0; j <= K; ++j) {
      ans = (ans + dp[0][200][i][j]) % p;
      if (m1) ans = (ans + dp[1][200][i][j]) % p;
    }
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &m, &K);
  getnum(L);
  getnum(R);
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &n1);
    for (int j = 1; j <= n1; ++j) scanf("%d", &AA[j]);
    scanf("%d", &x);
    build(0, x, 1);
  }
  calc_fail();
  for (int i = 1; i <= tot; ++i) dfs(i);
  int p1 = dpsolve(R, 1) - dpsolve(L, 0);
  printf("%d\n", (p1 + p) % p);
  return 0;
}
