#include <bits/stdc++.h>
using namespace std;
inline int qr() {
  int ret = 0, f = 0, c = getchar();
  while (!isdigit(c)) f |= c == 45, c = getchar();
  while (isdigit(c)) ret = ret * 10 + c - 48, c = getchar();
  return f ? -ret : ret;
}
struct cp {
  double x, y;
  cp(double X = 0, double Y = 0) : x(X), y(Y) {}
  cp operator*(const cp& a) const {
    return cp(x * a.x - y * a.y, x * a.y + y * a.x);
  }
  cp operator+(const cp& a) const { return cp(x + a.x, y + a.y); }
  cp operator-(const cp& a) const { return cp(x - a.x, y - a.y); }
};
const double pi = acos(-1);
cp WN[23], WNI[23];
void FFT(vector<cp>& a, int tag) {
  static int r[1 << 21];
  int len = a.size();
  for (int t = 1; t < len; ++t)
    if ((r[t] = r[t >> 1] >> 1 | (t & 1 ? len >> 1 : 0)) > t)
      swap(a[t], a[r[t]]);
  const cp* wn = tag == 1 ? WN : WNI;
  for (int t = 1, l = 0; t < len; t <<= 1, ++l) {
    for (int i = 0; i < len; i += t << 1) {
      cp w = 1, p;
      for (int j = 0; j < t; ++j, w = w * wn[l])
        p = w * a[i + j + t], a[i + j + t] = a[i + j] - p,
        a[i + j] = a[i + j] + p;
    }
  }
  if (tag != 1) {
    cp x = 1.0 / len;
    for (int t = 0; t < len; ++t) a[t] = a[t] * x;
  }
}
vector<cp> operator*(vector<cp> a, vector<cp> b) {
  int t1 = a.size() + b.size() - 1, len = 1;
  while (len < t1) len <<= 1;
  a.resize(len), b.resize(len);
  FFT(a, 1), FFT(b, 1);
  for (int t = 0; t < len; ++t) a[t] = a[t] * b[t];
  return FFT(a, 0), a.resize(t1), a;
}
vector<cp> reverse_mul(vector<cp> a, vector<cp> b) {
  return reverse(a.begin(), a.end()), a = a * b, a.resize(b.size()),
                                      reverse(a.begin(), a.end()), a;
}
struct E {
  int u, v, c;
} e[105];
int dis[51][51];
vector<cp> P[105], s[105];
vector<double> f[51];
int n, m, T, X;
void getS(int l, int mid, int r) {
  vector<cp> a;
  for (int t = 1; t <= m; ++t) {
    a = reverse_mul(
        vector<cp>(f[e[t].v].begin() + mid + 1, f[e[t].v].begin() + r + 1),
        vector<cp>(P[t].begin() + 1, P[t].begin() + r - l + 1));
    for (int i = l; i <= mid; ++i) s[t][i] = s[t][i] + a[i - l];
  }
}
void solve(int l, int r) {
  if (l == r) {
    for (int t = 1; t <= m; ++t)
      f[e[t].u][l] = min(f[e[t].u][l], s[t][l].x + e[t].c);
    return;
  }
  int mid = (l + r) >> 1;
  solve(mid + 1, r);
  getS(l, mid, r);
  solve(l, mid);
}
int main() {
  n = qr();
  m = qr();
  T = qr();
  X = qr();
  for (int t = 1; t <= 21; ++t)
    WN[t] = cp(cos(pi / (1 << t)), sin(pi / (1 << t))),
    WNI[t] = cp(cos(pi / (1 << t)), -sin(pi / (1 << t)));
  memset(dis, 0x3f, sizeof dis);
  for (int t = 1; t <= n; ++t) dis[t][t] = 0;
  for (int t = 1, a, b, c; t <= m; ++t) {
    a = qr();
    b = qr();
    c = qr();
    e[t] = (E){a, b, c};
    P[t].resize(T + T + 1);
    dis[a][b] = min(dis[a][b], c);
    for (int i = 1; i <= T; ++i) P[t][i] = qr() / 1e5;
    s[t].resize(T + T + 1);
  }
  for (int k = 1; k <= n; ++k)
    for (int t = 1; t <= n; ++t)
      for (int i = 1; i <= n; ++i)
        dis[t][i] =
            min({0ll + dis[t][i], 0x3f3f3f3fll, 0ll + dis[t][k] + dis[k][i]});
  for (int t = 1; t <= n; ++t) {
    f[t].resize(T + T + 1, t != n ? 0x3f3f3f3f : 0);
    for (int i = T + 1; i <= T + T; ++i)
      f[t][i] = min(0x3f3f3f3f, dis[t][n] + X);
  }
  getS(0, T, T + T);
  solve(0, T);
  printf("%.10lf\n", abs(f[1][0]));
  return 0;
}
