#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const double INF = 1e9;
struct cp {
  double r, i;
  cp(double _r = 0, double _i = 0) { r = _r, i = _i; }
  cp operator+(const cp &rhs) { return cp(r + rhs.r, i + rhs.i); }
  cp operator-(const cp &rhs) { return cp(r - rhs.r, i - rhs.i); }
  cp operator*(const cp &rhs) {
    return cp(r * rhs.r - i * rhs.i, r * rhs.i + i * rhs.r);
  }
};
int R[80808], L;
void fft(cp *a, int n, int op) {
  for (int i = 0; i < n; ++i)
    if (i < R[i]) swap(a[i], a[R[i]]);
  for (int h = 2; h <= n; h <<= 1) {
    cp wn(cos(2 * PI / h), op * sin(2 * PI / h));
    for (int i = 0, m = h / 2; i < n; i += h) {
      cp w(1, 0);
      for (int j = 0; j < m; ++j) {
        cp x = a[i + j], y = a[i + j + m] * w;
        a[i + j] = x + y, a[i + j + m] = x - y;
        w = w * wn;
      }
    }
  }
  if (~op) return;
  for (int i = 0; i < n; ++i) a[i].r /= n;
}
int prework(int n) {
  int m = 1;
  L = -1;
  while (m <= n) m <<= 1, ++L;
  for (int i = 1; i < m; ++i) R[i] = (R[i >> 1] >> 1) | ((i & 1) << L);
  return m;
}
int n, m, t, X, dis[111], inq[55];
int tot, fir[55], bg[111], nxt[111], to[111], val[111];
double p[111][20202], f[55][20202], g[111][20202];
vector<int> E[55];
cp x[80808], y[80808];
void addE(int u, int v, int w) {
  nxt[++tot] = fir[u], bg[tot] = u, fir[u] = tot, to[tot] = v, val[tot] = w;
}
void spfa() {
  queue<int> q;
  memset(dis, 0x3f, sizeof dis);
  q.push(n), dis[n] = 0, inq[n] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop(), inq[u] = 0;
    for (auto i : E[u]) {
      int v = bg[i];
      if (dis[v] > dis[u] + val[i]) {
        dis[v] = dis[u] + val[i];
        if (!inq[v]) q.push(v), inq[v] = 1;
      }
    }
  }
}
void calc(int now) {
  for (int u = 1; u < n; ++u) {
    f[u][now] = INF;
    for (int i = fir[u]; i; i = nxt[i])
      f[u][now] = min(f[u][now], g[i][now] + val[i]);
  }
  f[n][now] = 0;
}
void cdqfft(int l, int r) {
  if (l == r) return calc(l);
  int mid = (l + r) >> 1;
  cdqfft(mid + 1, r);
  int lim = prework(r - mid + r - l);
  for (int v = 1; v <= n; ++v) {
    if (!E[v].size()) continue;
    for (int i = mid + 1; i <= r; ++i) x[i - mid - 1] = cp(f[v][i], 0);
    for (int i = r - mid; i < lim; ++i) x[i] = cp();
    fft(x, lim, 1);
    for (int e : E[v]) {
      for (int i = t - (r - l - 1), j = 0; i <= t; ++i) y[j++] = cp(p[e][i], 0);
      for (int i = r - l; i < lim; ++i) y[i] = cp();
      fft(y, lim, 1);
      for (int i = 0; i < lim; ++i) y[i] = x[i] * y[i];
      fft(y, lim, -1);
      for (int i = l; i <= mid; ++i) g[e][i] += y[i - l + r - mid - 1].r;
    }
  }
  cdqfft(l, mid);
}
int main() {
  cin >> n >> m >> t >> X;
  for (int i = 1, u, v, w; i <= m; ++i) {
    scanf("%d%d%d", &u, &v, &w), addE(u, v, w);
    for (int j = 1, q; j <= t; ++j) scanf("%d", &q), p[i][j] = 1.0 * q / 1e5;
    reverse(p[i] + 1, p[i] + t + 1);
    for (int j = 1; j <= t; ++j) g[i][j] = g[i][j - 1] + p[i][j];
    E[v].push_back(i);
  }
  spfa();
  for (int i = 1; i <= m; ++i)
    for (int j = 0; j <= t; ++j) g[i][j] = g[i][j] * (dis[to[i]] + X);
  cdqfft(0, t);
  printf("%.10lf\n", f[1][0]);
  return 0;
}
