#include <bits/stdc++.h>
const int N = 20005;
const double pi = acos(-1.0);
int rev[N << 2], a[105], b[105], c[105], dist[55][55], m;
double f[55][N << 1], g[105][N], p[105][N << 1];
int read() {
  int x = 0, ch = getchar();
  for (; ch < 48 || ch > 57; ch = getchar())
    ;
  for (; ch >= 48 && ch <= 57; ch = getchar()) x = x * 10 + ch - 48;
  return x;
}
struct C {
  double x, y;
  C() {}
  C(double a, double b) : x(a), y(b) {}
} A[N << 2], B[N << 2];
C operator+(C a, C b) { return C(a.x + b.x, a.y + b.y); }
C operator-(C a, C b) { return C(a.x - b.x, a.y - b.y); }
C operator*(C a, C b) {
  return C(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
}
void operator/=(C &a, double b) {
  a.x /= b;
  a.y /= b;
}
void FFT(C *a, int n, int op) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) std::swap(a[i], a[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    C wn(cos(pi / i), op * sin(pi / i));
    for (int j = 0; j < n; j += i << 1) {
      C w(1, 0);
      for (int k = j; k < j + i; k++, w = w * wn) {
        C x = a[k], y = w * a[k + i];
        a[k] = x + y;
        a[k + i] = x - y;
      }
    }
  }
  if (op == -1)
    for (int i = 0; i < n; i++) a[i] /= n;
}
void work(int l, int mid, int r) {
  int n = 1, len = 0, L = r - mid - 1 + r - l;
  for (; n <= L; len++) n <<= 1;
  for (int i = 1; i < n; i++)
    rev[i] = rev[i >> 1] >> 1 ^ ((i & 1) << (len - 1));
  for (int i = 1; i <= m; i++) {
    int x = b[i];
    for (int j = 0; j < n; j++) A[j] = B[j] = C(0, 0);
    for (int j = mid + 1; j <= r; j++) A[r - j] = C(f[x][j], 0);
    for (int j = 0; j <= r - l; j++) B[j] = C(p[i][j], 0);
    FFT(A, n, 1);
    FFT(B, n, 1);
    for (int j = 0; j < n; j++) A[j] = A[j] * B[j];
    FFT(A, n, -1);
    for (int j = l; j <= mid; j++) g[i][j] += A[r - j].x;
  }
}
void solve(int l, int r) {
  if (l == r) {
    for (int i = 1; i <= m; i++)
      f[a[i]][l] = std::min(f[a[i]][l], g[i][l] + c[i]);
    return;
  }
  int mid = (l + r) >> 1;
  solve(mid + 1, r);
  work(l, mid, r);
  solve(l, mid);
}
int main() {
  memset(dist, 0x3f, sizeof dist);
  memset(f, 0x7f, sizeof f);
  int n, t, x;
  n = read();
  m = read();
  t = read();
  x = read();
  for (int i = 1; i <= n; i++) dist[i][i] = 0;
  for (int i = 1; i <= m; i++) {
    a[i] = read();
    b[i] = read();
    c[i] = read();
    dist[a[i]][b[i]] = c[i];
    for (int j = 1; j <= t; j++) scanf("%lf", &p[i][j]), p[i][j] /= 100000;
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        dist[i][j] = std::min(dist[i][j], dist[i][k] + dist[k][j]);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= t; j++) f[i][j + t] = dist[i][n] + x;
  for (int i = 0; i <= t; i++) f[n][i] = 0;
  work(0, t, t << 1);
  solve(0, t);
  printf("%.10f", f[1][0]);
}
