#include <bits/stdc++.h>
using namespace std;
int m, K;
int nc;
int to[210][20], fail[210], gain[210], par[210], label[210];
int str[210], slen;
void read() {
  scanf("%d", &slen);
  for (int i = 0; i < slen; i++) {
    scanf("%d", &str[slen - i - 1]);
  }
}
void reg(int gp) {
  int r = 0;
  for (int j = 0; j < slen; j++) {
    int i = str[j];
    if (!to[r][i]) {
      to[r][i] = nc;
      par[nc] = r;
      label[nc] = i;
      ++nc;
    }
    r = to[r][i];
  }
  gain[r] += gp;
}
void make() {
  queue<int> q;
  q.push(0);
  while (q.size()) {
    int i = q.front();
    q.pop();
    int j = par[i], k = label[i];
    while (j) {
      j = fail[j];
      if (to[j][k]) {
        fail[i] = to[j][k];
        break;
      }
    }
    gain[i] += gain[fail[i]];
    for (int l = 0; l < m; l++) {
      if (to[i][l]) {
        q.push(to[i][l]);
      }
    }
  }
  for (int i = 1; i < nc; i++) {
    for (int j = 0; j < m; j++) {
      if (!to[i][j]) {
        int l = i;
        while (l > 0) {
          l = fail[l];
          if (to[l][j]) {
            to[i][j] = to[l][j];
            break;
          }
        }
      }
    }
  }
}
const int mod = 1000000007;
void add(int &t, int v) {
  t += v;
  if (t >= mod) t -= mod;
}
int dp[2][2][210][510];
int go(vector<int> &v) {
  if (v.empty()) return 0;
  int res = 0;
  for (int j = 0; j < nc; j++) {
    for (int k = 0; k < K; k++) {
      dp[0][0][j][k] = dp[0][1][j][k] = 0;
    }
  }
  dp[0][0][0][0] = dp[0][1][0][0] = 1;
  for (int i = 0; i + 1 < v.size(); i++) {
    int y = i & 1, z = y ^ 1;
    for (int j = 0; j < nc; j++) {
      for (int k = 0; k < K; k++) {
        dp[z][0][j][k] = dp[z][1][j][k] = 0;
      }
    }
    for (int j = 0; j < nc; j++) {
      for (int k = 0; k < K; k++) {
        for (int l = 0; l < m; l++) {
          int t = to[j][l];
          if (k + gain[t] < K) {
            add(dp[z][0][t][k + gain[t]], dp[y][0][j][k]);
            if (l) {
              add(res, dp[y][0][j][k]);
            }
          }
        }
        for (int l = 0; l < v[i]; l++) {
          int t = to[j][l];
          if (k + gain[t] < K) {
            add(dp[z][1][t][k + gain[t]], dp[y][0][j][k]);
          }
        }
        int t = to[j][v[i]];
        if (k + gain[t] < K) {
          add(dp[z][1][t][k + gain[t]], dp[y][1][j][k]);
        }
      }
    }
  }
  for (int j = 0; j < nc; j++) {
    for (int k = 0; k < K; k++) {
      int vs = v.size();
      int y = (vs & 1) ^ 1;
      for (int l = 1; l < v[vs - 1]; l++) {
        int t = to[j][l];
        if (k + gain[t] < K) {
          add(res, dp[y][0][j][k]);
        }
      }
      int t = to[j][v[vs - 1]];
      if (k + gain[t] < K) {
        add(res, dp[y][1][j][k]);
      }
    }
  }
  return res;
}
int main() {
  int n;
  scanf("%d%d%d", &n, &m, &K);
  ++K;
  vector<int> L, R;
  read();
  int co = 1;
  for (int i = 0; i < slen; i++) {
    if (!co) {
      L.push_back(str[i]);
    } else if (co && str[i] == 0) {
      L.push_back(m - 1);
    } else {
      co = 0;
      if (i < slen - 1 || str[i] != 1) {
        L.push_back(str[i] - 1);
      }
    }
  }
  read();
  for (int i = 0; i < slen; i++) {
    R.push_back(str[i]);
  }
  nc = 1;
  for (int i = 0; i < n; i++) {
    read();
    int gp;
    scanf("%d", &gp);
    reg(gp);
  }
  make();
  int ans = go(R);
  add(ans, mod - go(L));
  printf("%d\n", ans);
  return 0;
}
