#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  int f = 0;
  x = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) f |= (ch == '-');
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  if (f) x = -x;
}
template <class T>
inline int cmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
const double pi = acos(-1), inf = 1e99;
struct C {
  double r, i;
  C operator+(const C &o) const { return (C){r + o.r, i + o.i}; }
  C operator-(const C &o) const { return (C){r - o.r, i - o.i}; }
  C operator/(const double &o) const { return (C){r / o, i / o}; }
  C operator*(const C &o) const {
    return (C){r * o.r - i * o.i, r * o.i + i * o.r};
  }
};
namespace Poly {
const int N = (1 << 20) + 5;
int mx;
void dft(vector<C> &A, int n) {
  static C W[N << 1], *H[30], *las = W;
  for (; mx < n; mx++) {
    H[mx] = las;
    C w = (C){1, 0};
    C wn = (C){cos(pi / (1 << mx)), sin(pi / (1 << mx))};
    for (int i = (0); i < (1 << mx); i++) *las++ = w, w = w * wn;
  }
  static C a[N];
  A.resize(1 << n);
  for (int i = 0, j = 0; i < (1 << n); i++) {
    a[i] = A[j];
    for (int k = 1 << (n - 1); (j ^= k) < k; k >>= 1)
      ;
  }
  for (int k = 0, d = 1; k < n; k++, d <<= 1)
    for (int i = 0; i < (1 << n); i += d << 1) {
      C *l = a + i, *r = a + i + d, *w = H[k], t;
      for (int j = 0; j < d; ++j, ++l, ++r)
        t = (*w++) * (*r), *r = *l - t, *l = *l + t;
    }
  for (int i = (0); i < (1 << n); i++) A[i] = a[i];
}
void idft(vector<C> &a, int n) {
  a.resize(1 << n);
  reverse(a.begin() + 1, a.end());
  dft(a, n);
  double pw = 1 << n;
  for (int i = (0); i < (1 << n); i++) a[i] = a[i] / pw;
}
vector<double> mul(vector<double> A, vector<double> &B) {
  vector<C> a(A.size()), b(B.size());
  for (int i = (0); i < (A.size()); i++) a[i] = (C){A[i], 0};
  for (int i = (0); i < (B.size()); i++) b[i] = (C){B[i], 0};
  int aim = a.size() + b.size() - 1, n = 1;
  while ((1 << n) <= aim) n++;
  dft(a, n), dft(b, n);
  for (int i = (0); i < (1 << n); i++) a[i] = a[i] * b[i];
  idft(a, n), A.resize(aim);
  for (int i = (0); i < (aim); i++) A[i] = a[i].r;
  return A;
}
}  // namespace Poly
const int N = 105, M = 20005;
int a[N], b[N], c[N], n, m, T, x;
double f[N][M], g[N][M], p[N][M], suf[N][M];
void solve(int l, int r) {
  if (l == r) {
    for (int i = (1); i <= (n - 1); i++) f[i][l] = inf;
    for (int i = (1); i <= (m); i++)
      cmin(f[a[i]][l], g[i][l] + c[i] + suf[i][T + 1 - l] * f[b[i]][T + 1]);
    return;
  }
  int mid = (l + r) >> 1;
  solve(mid + 1, r);
  for (int k = (1); k <= (m); k++) {
    vector<double> A(r - mid), B(r - l + 1);
    for (int i = (mid + 1); i <= (r); i++) A[r - i] = f[b[k]][i];
    for (int i = (1); i <= (r - l); i++) B[i] = p[k][i];
    A = Poly::mul(A, B);
    for (int i = (l); i <= (mid); i++) g[k][i] += A[r - i];
  }
  solve(l, mid);
}
int main() {
  read(n), read(m), read(T), read(x);
  for (int i = (1); i <= (m); i++) {
    read(a[i]), read(b[i]), read(c[i]);
    for (int j = (1); j <= (T); j++) read(p[i][j]), p[i][j] /= 100000;
    for (int j = (T); j >= (1); j--) suf[i][j] = suf[i][j + 1] + p[i][j];
  }
  for (int i = (1); i <= (n); i++) f[i][T + 1] = inf;
  f[n][T + 1] = x;
  for (int tmp = (1); tmp <= (n); tmp++)
    for (int i = (1); i <= (m); i++)
      cmin(f[a[i]][T + 1], f[b[i]][T + 1] + c[i]);
  solve(0, T);
  printf("%.8lf\n", f[1][0]);
  return 0;
}
