#include <bits/stdc++.h>
using namespace std;
int n, m, t, x, st[105], ed[105], ct[105];
double p[105][80005], g[105][80005], f[105][80005];
int Q[80005], L, R;
int info[80005], Prev[80005], to[80005], cst[80005], cnt_e, dis[80005];
void Node(int u, int v, int w) {
  cnt_e++;
  Prev[cnt_e] = info[u], info[u] = cnt_e, to[cnt_e] = v, cst[cnt_e] = w;
}
struct cplx {
  double r, i;
  cplx() {}
  cplx(double r, double i) : r(r), i(i) {}
  cplx operator+(const cplx &Ano) const { return cplx(r + Ano.r, i + Ano.i); }
  cplx operator-(const cplx &Ano) const { return cplx(r - Ano.r, i - Ano.i); }
  cplx operator*(const cplx &Ano) const {
    return cplx(r * Ano.r - i * Ano.i, r * Ano.i + i * Ano.r);
  }
  cplx conj() { return cplx(r, -i); }
} A[80005], B[80005];
void FFT(cplx *A, int n, int typ) {
  for (int i = 0, j = 0, k; i < n; i++) {
    if (i < j) swap(A[i], A[j]);
    for (k = n >> 1; k; k >>= 1)
      if ((j ^= k) >= k) break;
  }
  cplx w, wn, x, y;
  for (int i = 2, j, k, len; i <= n; i <<= 1) {
    len = i >> 1;
    wn = cplx(cos(2 * 3.1415926535897932384626433832795 / i),
              sin(2 * 3.1415926535897932384626433832795 / i) * typ);
    for (j = 0, w = cplx(1, 0); j < n; j += i, w = cplx(1, 0))
      for (k = 0; k < len; k++, w = w * wn) {
        x = A[j + k], y = A[j + k + len] * w;
        A[j + k] = x + y;
        A[j + k + len] = x - y;
      }
  }
  if (typ == -1)
    for (int i = 0; i < n; i++) A[i] = A[i] * cplx(1.0 / n, 0);
}
void mul(double *ret, double *a, int lena, double *b, int lenb) {
  int n = 1;
  for (; n <= lena + lenb; n <<= 1)
    ;
  for (int i = 0; i < n; i++) {
    if (i < lena)
      A[i] = cplx(a[i], 0);
    else
      A[i] = cplx(0, 0);
    if (i < lenb)
      B[i] = cplx(b[i], 0);
    else
      B[i] = cplx(0, 0);
  }
  FFT(A, n, 1), FFT(B, n, 1);
  for (int i = 0; i < n; i++) A[i] = A[i] * B[i];
  FFT(A, n, -1);
  for (int i = 0; i < n; i++) ret[i] = A[i].r;
}
double seq[2][80005], C[80005];
void calc(int L, int mid, int R) {
  for (int i = 1; i <= m; i++) {
    for (int j = mid + 1; j <= R; j++) seq[0][j - mid - 1] = f[ed[i]][j];
    for (int j = L; j <= R; j++) seq[1][j - L] = p[i][R - j + 1];
    mul(C, seq[0], R - mid, seq[1], R - L + 1);
    for (int j = L; j <= mid; j++) g[i][j] += C[(R - L) - (mid - j)];
  }
}
void Solve(int L, int R) {
  if (L == R) {
    for (int i = 1; i < n; i++) f[i][L] = dis[i] + x;
    for (int i = 1; i <= m; i++)
      f[st[i]][L] = min(g[i][L] + ct[i], f[st[i]][L]);
    return;
  }
  if (L > R) return;
  int mid = (L + R) >> 1;
  Solve(mid + 1, R);
  calc(L, mid, R);
  Solve(L, mid);
}
int main() {
  scanf("%d%d%d%d", &n, &m, &t, &x);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &st[i], &ed[i], &ct[i]);
    Node(ed[i], st[i], ct[i]);
    for (int j = 1; j <= t; j++) scanf("%lf", &p[i][j]), p[i][j] /= 100000;
  }
  L = R = 0;
  Q[R++] = n;
  memset(dis, 0x3f, sizeof dis);
  dis[n] = 0;
  for (int now; L < R;) {
    now = Q[L++];
    for (int i = info[now]; i; i = Prev[i])
      if (dis[to[i]] > dis[now] + cst[i]) {
        dis[to[i]] = dis[now] + cst[i];
        Q[R++] = to[i];
      }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = t + 1; j <= 2 * t; j++) f[i][j] = dis[i] + x;
  }
  calc(0, t, 2 * t);
  Solve(0, t);
  printf("%.10lf\n", f[1][0]);
}
