#include <bits/stdc++.h>
using namespace std;
struct node {
  int vis[21], fail, end;
} a[210];
queue<int> h;
int n, m, K, l[210], r[210], tot, x, P = 1000000007, f[2][2][2][210][510],
                                     up[210], low[210];
inline void read(int& x) {
  char ch = getchar();
  int mk = 1;
  for (; (ch < '0' || ch > '9') && ch != '-'; ch = getchar())
    ;
  if (ch == '-') mk = -1, ch = getchar();
  for (x = 0; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48;
  x *= mk;
}
void Make_Trie(int l) {
  int u = 0, x;
  for (int i = 1; i <= l; i++) {
    read(x);
    if (!a[u].vis[x]) a[u].vis[x] = ++tot;
    u = a[u].vis[x];
  }
  read(x);
  a[u].end += x;
}
void Make_Fail() {
  h.push(0);
  while (h.size()) {
    int u = h.front(), p = a[u].fail;
    for (int i = 0; i < m; i++)
      if (a[u].vis[i]) {
        int v = a[u].vis[i];
        if (u) {
          a[v].fail = a[p].vis[i];
          a[v].end += a[a[v].fail].end;
        } else
          a[v].fail = 0;
        h.push(v);
      } else if (u)
        a[u].vis[i] = a[p].vis[i];
    h.pop();
  }
}
int Get(int b[210]) {
  if (b[0] == 1 && b[1] <= 0) return 0;
  int A = 0;
  for (int is = 0; is < 2; is++)
    for (int pre = 0; pre < 2; pre++)
      for (int j = 0; j <= tot; j++)
        for (int k = 0; k <= K; k++) f[A][is][pre][j][k] = 0;
  f[A][0][1][0][0] = 1;
  for (int i = b[0]; i; i--) {
    A ^= 1;
    for (int is = 0; is < 2; is++)
      for (int pre = 0; pre < 2; pre++)
        for (int j = 0; j <= tot; j++)
          for (int k = 0; k <= K; k++) f[A][is][pre][j][k] = 0;
    for (int pre = 0; pre < 2; pre++)
      for (int j = 0; j <= tot; j++)
        for (int k = 0; k <= K; k++)
          if (f[A ^ 1][0][pre][j][k]) {
            for (int l = 0; l < b[i]; l++) {
              int t1 = a[j].vis[l], t2 = k + a[t1].end;
              if (pre && l == 0)
                (f[A][1][1][0][0] += f[A ^ 1][0][pre][j][k]) %= P;
              else if (t2 <= K)
                (f[A][1][0][t1][t2] += f[A ^ 1][0][pre][j][k]) %= P;
            }
            int l = b[i];
            int t1 = a[j].vis[l], t2 = k + a[t1].end;
            if (t2 <= K) (f[A][0][0][t1][t2] += f[A ^ 1][0][pre][j][k]) %= P;
          }
    for (int pre = 0; pre < 2; pre++)
      for (int j = 0; j <= tot; j++)
        for (int k = 0; k <= K; k++)
          if (f[A ^ 1][1][pre][j][k]) {
            for (int l = 0; l < m; l++) {
              int t1 = a[j].vis[l], t2 = k + a[t1].end;
              if (pre && l == 0)
                (f[A][1][1][0][0] += f[A ^ 1][1][pre][j][k]) %= P;
              else if (t2 <= K)
                (f[A][1][0][t1][t2] += f[A ^ 1][1][pre][j][k]) %= P;
            }
          }
  }
  int ans = 0;
  for (int is = 0; is < 2; is++)
    for (int pre = 0; pre < 2; pre++)
      for (int j = 0; j <= tot; j++)
        for (int k = 0; k <= K; k++) (ans += f[A][is][pre][j][k]) %= P;
  return ans - 1;
}
int main() {
  read(n);
  read(m);
  read(K);
  read(l[0]);
  for (int i = l[0]; i; i--) read(l[i]);
  l[1]--;
  for (int i = 1; i < l[0]; i++)
    if (l[i] < 0) {
      l[i] += m, l[i + 1]--;
    } else
      break;
  while (l[l[0]] == 0 && l[0] > 1) l[0]--;
  read(r[0]);
  for (int i = r[0]; i; i--) read(r[i]);
  for (int i = 1; i <= n; i++) {
    read(x);
    Make_Trie(x);
  }
  Make_Fail();
  printf("%d\n", ((Get(r) - Get(l)) % P + P) % P);
  return 0;
}
