#include <bits/stdc++.h>
using namespace std;
const double Pi = acos(-1);
struct Complex {
  double real, image;
  Complex(double _real = 0, double _image = 0) : real(_real), image(_image) {}
  Complex operator-() const { return Complex(-real, -image); }
  friend Complex operator+(const Complex &A, const Complex &B) {
    return Complex(A.real + B.real, A.image + B.image);
  }
  friend Complex operator-(const Complex &A, const Complex &B) {
    return A + (-B);
  }
  friend Complex operator*(const Complex &A, const Complex &B) {
    return Complex(A.real * B.real - A.image * B.image,
                   A.image * B.real + A.real * B.image);
  }
} A[65538], B[65538], nul(0, 0);
double F[55][40005], G[105][40005], P[105][40005];
int U[105], V[105], C[105], S[55][55];
int order[65538];
int N, M, T, X;
void read(int &x) {
  static int sign;
  static char ch;
  x = 0;
  sign = 1;
  ch = getchar();
  while (ch < '0' || '9' < ch) {
    if (ch == '-') sign = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x = x * sign;
}
void Floyd() {
  memset(S, 0x3f, sizeof(S));
  for (int i = 1; i <= N; i++) S[i][i] = 0;
  for (int e = 1; e <= M; e++) S[U[e]][V[e]] = C[e];
  for (int k = 1; k <= N; k++)
    for (int i = 1; i <= N; i++)
      if (i != k)
        for (int j = 1; j <= N; j++)
          if (j != k && j != i) S[i][j] = min(S[i][j], S[i][k] + S[k][j]);
}
void FFT(Complex *Y, int n, int sign) {
  for (int i = 0; i < n; i++)
    if (i < order[i]) swap(Y[i], Y[order[i]]);
  for (int d = 2; d <= n; d <<= 1) {
    Complex dw(cos(2 * Pi / d), sin(sign * 2 * Pi / d)), w, tmp;
    for (int i = 0; w = Complex(1, 0), i < n; i += d)
      for (int k = i; k < i + d / 2; w = w * dw, k++)
        tmp = w * Y[k + d / 2], Y[k + d / 2] = Y[k] - tmp, Y[k] = Y[k] + tmp;
  }
  if (sign == -1)
    for (int i = 0; i < n; i++) Y[i].real /= 1.0 * n;
}
void contribution(int l, int mid, int r) {
  static int m, n, len;
  m = r - l + 1;
  for (n = 1, len = 0; n <= m + r - mid; n <<= 1) len++;
  for (int i = 1; i < n; i++)
    order[i] = (order[i >> 1] >> 1) | ((i & 1) << (len - 1));
  for (int e = 1; e <= M; e++) {
    for (int i = 0; i < n; i++) A[i] = B[i] = nul;
    for (int i = 1; i < m; i++) B[i] = Complex(P[e][i], 0);
    for (int i = mid; i <= r; i++) A[r - i] = Complex(F[V[e]][i], 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 = l; i < mid; i++) G[e][i] += A[r - i].real;
  }
}
void solve(int l, int r) {
  if (l == r) {
    for (int i = 1; i < N; i++) F[i][l] = S[i][N] + X;
    for (int e = 1; e <= M; e++) F[U[e]][l] = min(F[U[e]][l], C[e] + G[e][l]);
    return;
  }
  int mid = (l + r + 1) / 2;
  solve(mid, r);
  contribution(l, mid, r);
  solve(l, mid - 1);
}
int main() {
  read(N);
  read(M);
  read(T);
  read(X);
  for (int e = 1, x; e <= M; e++) {
    read(U[e]);
    read(V[e]);
    read(C[e]);
    for (int i = 1; i <= T; i++) read(x), P[e][i] = 1.0 * x / 100000;
  }
  Floyd();
  for (int i = 1; i <= N; i++)
    for (int j = T + 1; j <= 2 * T; j++) F[i][j] = S[i][N] + X;
  for (int j = 1; j <= T; j++) F[N][j] = 0;
  contribution(0, T + 1, 2 * T);
  solve(0, T);
  printf("%.8lf\n", F[1][0]);
  return 0;
}
