#include <bits/stdc++.h>
using namespace std;
const int CHARSET = 20;
const int MAXNODE = 207;
const int MOD = (int)1e9 + 7;
struct Node {
  Node *ch[CHARSET], *fail;
  Node *jump[CHARSET];
  int ed;
  Node *go(int c);
} memo[MAXNODE], *bat, *root;
void newNode(Node *&o) {
  o = bat++;
  memset(o->ch, 0, sizeof(o->ch));
  o->ed = 0;
}
Node *Node::go(int c) {
  if (ch[c] == 0) {
    newNode(ch[c]);
  }
  return ch[c];
}
void init() {
  bat = memo;
  newNode(root);
}
void insert(vector<int> &str, int val) {
  Node *u = root;
  for (int i = 0; i < (int)str.size(); i++) {
    u = u->go(str[i]);
  }
  u->ed += val;
}
int getId(Node *u) { return u - memo; }
void build() {
  static Node *que[MAXNODE];
  int qf = 0, qe = 0;
  que[qe++] = root;
  while (qf != qe) {
    Node *u = que[qf++];
    for (int c = 0; c < CHARSET; c++) {
      Node *v = u->ch[c];
      if (v == 0) continue;
      Node *f = u->fail;
      while (f && f->ch[c] == 0) f = f->fail;
      if (f == 0)
        v->fail = root;
      else
        v->fail = f->ch[c];
      que[qe++] = v;
    }
  }
  for (int i = 0; i < CHARSET; i++) {
    root->jump[i] = root->ch[i] ? root->ch[i] : root;
  }
  for (int i = 1; i < qe; i++) {
    Node *u = que[i];
    for (int j = 0; j < CHARSET; j++) {
      if (u->ch[j])
        u->jump[j] = u->ch[j];
      else
        u->jump[j] = u->fail->jump[j];
    }
  }
  for (int i = 0; i < qe; i++) {
    Node *u = que[i];
    if (u->fail) u->ed += u->fail->ed;
  }
}
vector<int> L, R;
int n, m, K;
int dp[207][207][507];
void read(vector<int> &str) {
  int len;
  scanf("%d", &len);
  str.resize(len);
  for (int i = 0; i < len; i++) {
    scanf("%d", &str[i]);
  }
}
int calc(int at, bool LeadingZero, bool sameL, bool sameR, Node *u, int val) {
  if (val > K) return 0;
  if (at == (int)R.size()) return 1;
  bool save = !(sameL || sameR);
  if (save) {
    if (dp[at][getId(u)][val] != -1) return dp[at][getId(u)][val];
  }
  int ret = 0;
  for (int c = 0; c < m; c++) {
    if (sameL && c < L[at]) continue;
    if (sameR && c > R[at]) continue;
    Node *nu = u;
    if (!LeadingZero || c) nu = u->jump[c];
    ret += calc(at + 1, LeadingZero && c == 0, sameL && c == L[at],
                sameR && c == R[at], nu, val + nu->ed);
    if (ret >= MOD) ret -= MOD;
  }
  if (save) {
    dp[at][getId(u)][val] = ret;
  }
  return ret;
}
int main() {
  scanf("%d%d%d", &n, &m, &K);
  init();
  read(L);
  read(R);
  while (L.size() < R.size()) {
    L.insert(L.begin(), 0);
  }
  for (int i = 0; i < n; i++) {
    vector<int> str;
    int val;
    read(str);
    scanf("%d", &val);
    insert(str, val);
  }
  build();
  memset(dp, -1, sizeof(dp));
  printf("%d\n", calc(0, true, true, true, root, 0));
  return 0;
}
