#include <bits/stdc++.h>
using namespace std;
inline int read() {
  register int x = 0, f = 1;
  register char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + (ch ^ '0');
    ch = getchar();
  }
  return f ? x : -x;
}
const double pai = acos(-1.0);
const int N = (1 << 16) + 10, M = 1e2 + 10, T = 2e4 + 10;
int n, m, t, X, vis[M], trans[N], head[M], num;
double dis[M], p[M][T << 1], f[M][T << 1], g[M][T << 1];
struct path {
  int x, y, w;
} pt[M];
struct edge {
  int to, val, next;
} e[M];
inline void add(int u, int v, int w) {
  e[++num] = (edge){v, w, head[u]}, head[u] = num;
}
struct cmplx {
  double x, y;
  inline cmplx(double X = 0, double Y = 0) : x(X), y(Y) {}
  inline cmplx operator+(const cmplx &a) { return (cmplx){x + a.x, y + a.y}; }
  inline cmplx operator-(const cmplx &a) { return (cmplx){x - a.x, y - a.y}; }
  inline cmplx operator*(const cmplx &a) {
    return (cmplx){x * a.x - y * a.y, x * a.y + y * a.x};
  }
} a[N], b[N];
inline void FFT(cmplx *f, int n, int flg) {
  for (int i = (0), ed = (n - 1); i <= ed; ++i)
    if (i < trans[i]) swap(f[i], f[trans[i]]);
  for (int len = 2; len <= n; len <<= 1) {
    int d = len >> 1;
    cmplx e = cmplx(cos(2 * pai / len), sin(2 * pai / len));
    if (flg) e.y = -e.y;
    for (int p = 0; p < n; p += len) {
      cmplx nw = cmplx(1, 0);
      for (int i = p; i < p + d; ++i, nw = nw * e) {
        cmplx t = nw * f[i + d];
        f[i + d] = f[i] - t;
        f[i] = f[i] + t;
      }
    }
  }
}
inline void Times(cmplx *f, cmplx *g, int m1, int m2) {
  int n = 1;
  for (; n < m1 + m2; n <<= 1)
    ;
  for (int i = (0), ed = (n - 1); i <= ed; ++i)
    trans[i] = (trans[i >> 1] >> 1) | ((i & 1) ? (n >> 1) : 0);
  for (int i = (m1), ed = (n - 1); i <= ed; ++i) f[i] = cmplx(0, 0);
  for (int i = (m2), ed = (n - 1); i <= ed; ++i) g[i] = cmplx(0, 0);
  FFT(f, n, 0);
  FFT(g, n, 0);
  for (int i = (0), ed = (n - 1); i <= ed; ++i) f[i] = f[i] * g[i];
  FFT(f, n, 1);
  for (int i = (0), ed = (n - 1); i <= ed; ++i) f[i].x /= n;
}
inline void Solve(int l, int r) {
  if (l == r) {
    if (l <= t) {
      for (int i = (1), ed = (n - 1); i <= ed; ++i) f[i][l] = 1e12;
      for (int i = (1), ed = (m); i <= ed; ++i)
        f[pt[i].x][l] = min(f[pt[i].x][l], g[i][l] / 100000 + pt[i].w);
    }
    return;
  }
  int mid = (l + r) >> 1;
  Solve(mid + 1, r);
  if (l <= t) {
    int m1 = r - mid, m2 = r - l;
    for (int k = (1), ed = (m); k <= ed; ++k) {
      for (int i = (0), ed = (m1 - 1); i <= ed; ++i)
        a[i] = cmplx(f[pt[k].y][i + mid + 1], 0);
      for (int i = (0), ed = (m2 - 1); i <= ed; ++i)
        b[i] = cmplx(p[k][r - l - i], 0);
      Times(a, b, m1, m2);
      for (int i = (l), ed = (mid); i <= ed; ++i)
        g[k][i] += a[r - l + i - mid - 1].x;
    }
  }
  Solve(l, mid);
}
int main() {
  n = read(), m = read(), t = read(), X = read();
  for (int i = (1), ed = (m); i <= ed; ++i) {
    pt[i] = (path){read(), read(), read()};
    add(pt[i].y, pt[i].x, pt[i].w);
    for (int j = (1), ed = (t); j <= ed; ++j) p[i][j] = read();
  }
  queue<int> q;
  for (int i = (1), ed = (n); i <= ed; ++i) dis[i] = 1e12;
  dis[n] = X;
  q.push(n);
  vis[n] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    vis[u] = 0;
    for (int i = head[u]; i; i = e[i].next) {
      int v = e[i].to;
      if (dis[v] <= dis[u] + e[i].val) continue;
      dis[v] = dis[u] + e[i].val;
      if (!vis[v]) vis[v] = 1, q.push(v);
    }
  }
  for (int i = (1), ed = (n); i <= ed; ++i)
    for (int j = (t + 1), ed = (t + t); j <= ed; ++j) f[i][j] = dis[i];
  Solve(0, t + t);
  printf("%.9lf\n", f[1][0]);
  return 0;
}
