#include <bits/stdc++.h>
using namespace std;
template <class T>
void out(T A[], int n) {
  for (int i = 0; i < n; i++) cout << A[i] << " ";
  cout << endl;
}
template <class T>
void out(vector<T> A, int n = -1) {
  if (n == -1) n = A.size();
  for (int i = 0; i < n; i++) cout << A[i] << " ";
  cout << endl;
}
const int MAXN = 300000 + 5;
const int MAXM = 9999999;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double EPS = 1e-11;
const int CHILD_NUM = 20;
const int MOD = 1000000007;
int n, m, k;
int digit_l[200 + 5], digit_r[200 + 5], len_l, len_r;
struct AC {
  int next[MAXN][CHILD_NUM], fail[MAXN], end[MAXN];
  int size, root;
  int newNode() {
    memset(next[size], -1, sizeof(next[size]));
    fail[size] = -1;
    end[size] = 0;
    return size++;
  }
  int init() {
    size = 0;
    root = newNode();
    return 0;
  }
  int insert(int s[], int len, int v) {
    int cur = root;
    int i = 0;
    while (i < len) {
      if (next[cur][s[i]] == -1) next[cur][s[i]] = newNode();
      cur = next[cur][s[i]];
      ++i;
    }
    end[cur] += v;
    return 0;
  }
  int build() {
    queue<int> q;
    fail[root] = -1;
    for (int i = 0; i < m; ++i)
      if (next[root][i] == -1) {
        next[root][i] = root;
      } else {
        fail[next[root][i]] = root;
        q.push(next[root][i]);
      }
    while (!q.empty()) {
      int cur = q.front();
      q.pop();
      end[cur] += end[fail[cur]];
      for (int i = 0; i < m; ++i)
        if (next[cur][i] == -1) {
          next[cur][i] = next[fail[cur]][i];
        } else {
          fail[next[cur][i]] = next[fail[cur]][i];
          q.push(next[cur][i]);
        }
    }
    return 0;
  }
};
AC ac;
int f[205][505][205];
int dfs(int pos, int v, int node, int zero, int limit, int digit[], int len) {
  v += ac.end[node];
  if (v > k) return 0;
  if (pos >= len) return 1;
  if (!limit && f[pos][v][node] != -1) return f[pos][v][node];
  int end = limit ? digit[pos] : m - 1;
  int ans = 0;
  if (zero) {
    ans += dfs(pos + 1, v, node, zero, limit && digit[pos] == 0, digit, len);
    if (ans >= MOD) ans -= MOD;
  } else {
    ans += dfs(pos + 1, v, ac.next[node][0], zero, limit && digit[pos] == 0,
               digit, len);
    if (ans >= MOD) ans -= MOD;
  }
  for (int i = 1; i <= end; ++i) {
    int nextNode = ac.next[node][i];
    ans += dfs(pos + 1, v, nextNode, 0, limit && i == end, digit, len);
    if (ans >= MOD) ans -= MOD;
  }
  if (!limit) f[pos][v][node] = ans;
  return ans;
}
int cal(int digit[], int len) {
  memset(f, -1, sizeof(f));
  return dfs(0, 0, ac.root, 1, 1, digit, len);
}
int sub(int digit[], int &len) {
  --digit[len - 1];
  for (int i = len - 1; i >= 0; --i)
    if (digit[i] < 0) {
      digit[i] += m;
      digit[i - 1] -= 1;
    }
  if (digit[0] == 0) {
    for (int i = 1; i < len; ++i) digit[i - 1] = digit[i];
    --len;
  }
  return 0;
}
int rec(int at, bool leadingZero, bool sameL, bool sameR, int u, int have) {
  have += ac.end[u];
  if (have > k) return 0;
  if (at == len_l) {
    return 1;
  }
  bool save = !(sameL || sameR);
  int ret = 0;
  if (save) {
    ret = f[at][u][have];
    if (ret != -1) return ret;
    ret = 0;
  }
  for (int nxt = 0; nxt < m; ++nxt) {
    if (sameL && nxt < digit_l[at]) continue;
    if (sameR && nxt > digit_r[at]) continue;
    int nu = u;
    if (!leadingZero || nxt > 0) nu = ac.next[u][nxt];
    ret += rec(at + 1, leadingZero && (nxt == 0), sameL && (nxt == digit_l[at]),
               sameR && (nxt == digit_r[at]), nu, have);
    if (ret >= MOD) ret -= MOD;
  }
  if (save) {
    f[at][u][have] = ret;
  }
  return ret;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  scanf("%d", &len_l);
  for (int i = 0; i < len_l; ++i) scanf("%d", &digit_l[i]);
  scanf("%d", &len_r);
  for (int i = 0; i < len_r; ++i) scanf("%d", &digit_r[i]);
  for (int i = len_r - 1; i >= len_r - len_l; --i)
    digit_l[i] = digit_l[i - len_r + len_l];
  for (int i = len_r - len_l - 1; i >= 0; --i) digit_l[i] = 0;
  len_l = len_r;
  ac.init();
  for (int i = 0; i < n; ++i) {
    int len, t[200 + 5], v;
    scanf("%d", &len);
    for (int j = 0; j < len; ++j) scanf("%d", &t[j]);
    scanf("%d", &v);
    ac.insert(t, len, v);
  }
  ac.build();
  memset(f, -1, sizeof(f));
  int ans = rec(0, 1, 1, 1, ac.root, 0);
  cout << ans << endl;
  return 0;
}
