#include <bits/stdc++.h>
using namespace std;
const int maxN = 57;
const int maxM = 107;
const int maxT = 20007;
const int INF = 1e9 + 7;
template <class T>
inline T rd() {
  bool f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = 0;
  T x = 0;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;
  return f ? x : -x;
}
int n, m, T, fine;
struct edge {
  int x, y, cost;
} e[maxM];
double Pr[maxM][maxT], gt[maxM][maxT];
double g[maxN], f[maxT][maxN];
double ed[maxT][maxM];
namespace poly {
const int maxL = 65539;
struct CP {
  double r, i;
  CP(double _r = 0, double _i = 0) { r = _r, i = _i; }
  inline CP operator+(const CP &v) { return (CP){r + v.r, i + v.i}; }
  inline CP operator-(const CP &v) { return (CP){r - v.r, i - v.i}; }
  inline CP operator*(const CP &v) {
    return (CP){r * v.r - i * v.i, r * v.i + i * v.r};
  }
  inline void operator/=(const double d) { r /= d, i /= d; }
  inline friend CP conj(const CP &v) { return (CP){v.r, -v.i}; }
};
int L, rev[maxL];
CP pwg[2][maxL];
void init() {
  static const double pi = acos(-1.);
  for (int i = 2; i < maxL; i <<= 1)
    pwg[0][i] = CP(cos(2 * pi / i), sin(2 * pi / i)),
    pwg[1][i] = conj(pwg[0][i]);
}
inline void getL(int len) {
  for (L = 2; L <= len; L <<= 1)
    ;
  for (int i = (0), _ = (L); i < _; ++i)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) ? (L >> 1) : 0);
}
inline void cpy(CP *A, double *B, int len) {
  for (int i = (0), _ = (L); i < _; ++i) A[i] = (i <= len) ? CP(B[i]) : CP(0);
}
inline void cpy(double *A, CP *B, int len) {
  for (int i = (0), _ = (L); i < _; ++i) A[i] = (i <= len) ? B[i].r : 0;
}
void FFT(CP *a, int kd) {
  int i, j, k;
  CP W, Wn, u, v;
  for (int i = (0), _ = (L); i < _; ++i)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (i = 2; i <= L; i <<= 1)
    for (Wn = pwg[kd][i], j = 0; j < L; j += i)
      for (W = CP(1), k = j; k < j + i / 2; ++k, W = W * Wn)
        u = a[k], v = a[k + i / 2] * W, a[k] = u + v, a[k + i / 2] = u - v;
  if (kd)
    for (int i = (0), _ = (L); i < _; ++i) a[i] /= L;
}
void conv(double *A, double *B, double *C, int n, int m, int lim) {
  static CP a[maxL], b[maxL];
  getL(n + m);
  cpy(a, A, n), cpy(b, B, m);
  FFT(a, 0), FFT(b, 0);
  for (int i = (0), _ = (L); i < _; ++i) a[i] = a[i] * b[i];
  FFT(a, 1);
  cpy(C, a, lim);
}
}  // namespace poly
namespace Graph {
void getg() {
  static int f[maxN][maxN];
  memset(f, 0x3f, sizeof f);
  for (int i = (1), _ = (m); i <= _; ++i) f[e[i].x][e[i].y] = e[i].cost;
  for (int k = (1), _ = (n); k <= _; ++k)
    for (int i = (1), _ = (n); i <= _; ++i)
      for (int j = (1), _ = (n); j <= _; ++j)
        f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  assert(g[1] != 1061109567);
  for (int i = (1), _ = (n); i <= _; ++i) g[i] = f[i][n];
  g[n] = 0;
}
}  // namespace Graph
namespace Solve {
double a[maxT << 1], b[maxT << 1];
void cdq(int l, int r) {
  if (l == r) {
    for (int i = (1), _ = (n); i < _; ++i) f[l][i] = INF;
    f[l][n] = 0;
    for (int p = (1), _ = (m); p <= _; ++p) {
      int x = e[p].x, y = e[p].y;
      f[l][x] = min(f[l][x], e[p].cost + ed[l][p] + gt[p][l] * (g[y] + fine));
    }
    return;
  }
  int mid = (l + r) >> 1;
  cdq(l, mid);
  for (int p = (1), _ = (m); p <= _; ++p) {
    int y = e[p].y;
    for (int i = (l), _ = (mid); i <= _; ++i) a[i - l] = f[i][y];
    for (int i = (1), _ = (r - l); i <= _; ++i) b[i] = Pr[p][i];
    poly::conv(a, b, a, mid - l, r - l, r - l);
    for (int i = (mid + 1), _ = (r); i <= _; ++i) ed[i][p] += a[i - l];
  }
  cdq(mid + 1, r);
}
}  // namespace Solve
int main() {
  n = rd<int>(), m = rd<int>(), T = rd<int>(), fine = rd<int>();
  for (int i = (1), _ = (m); i <= _; ++i) {
    e[i].x = rd<int>(), e[i].y = rd<int>(), e[i].cost = rd<int>();
    for (int j = (1), _ = (T); j <= _; ++j) Pr[i][j] = rd<int>() / 100000.0;
    for (int j = (T), _ = (0); j >= _; --j)
      gt[i][j] = gt[i][j + 1] + Pr[i][j + 1];
  }
  Graph::getg();
  poly::init();
  Solve::cdq(0, T);
  printf("%.9lf\n", f[T][1]);
  return 0;
}
