#include <bits/stdc++.h>
using namespace std;
const int N = 66666;
const int M = 55;
const int sM = 105;
const int inf = 1e9 + 7;
const double pi = acos(-1);
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
  return x * f;
}
int lim, pp[N];
struct CP {
  double x, y;
  CP(double xx = 0, double yy = 0) { x = xx, y = yy; }
};
CP operator+(CP aa, CP bb) { return CP(aa.x + bb.x, aa.y + bb.y); }
CP operator-(CP aa, CP bb) { return CP(aa.x - bb.x, aa.y - bb.y); }
CP operator*(CP aa, CP bb) {
  return CP(aa.x * bb.x - aa.y * bb.y, aa.x * bb.y + aa.y * bb.x);
}
void FFT(CP *f, int flag) {
  for (int i = (0), iE = (lim - 1); i <= iE; i++)
    if (i < pp[i]) swap(f[i], f[pp[i]]);
  for (int i = 2; i <= lim; i <<= 1) {
    CP ch(cos(2 * pi / i), flag * sin(2 * pi / i));
    for (int l = (i >> 1), j = 0; j < lim; j += i) {
      CP now(1, 0);
      for (int k = j; k < j + l; k++) {
        CP pa = f[k], pb = now * f[k + l];
        f[k] = pa + pb, f[k + l] = pa - pb, now = now * ch;
      }
    }
  }
  if (flag == -1)
    for (int i = (0), iE = (lim - 1); i <= iE; i++)
      f[i].x /= lim, f[i].y /= lim;
}
CP A[N], B[N];
int n, m, t, x, dis[N];
int fu[N], fv[N], fval[N];
double ans[M][N], p[sM][N], calc[sM][N];
void Solve(int l, int mid, int r) {
  for (int d = (1), dE = (m); d <= dE; d++) {
    int tota = -1, totb = 0;
    B[0] = CP(0, 0);
    for (int i = (l), iE = (mid); i <= iE; i++)
      A[++tota] = CP(ans[fv[d]][i], 0);
    for (int i = (1), iE = (min(r - l + 1, t)); i <= iE; i++)
      B[++totb] = CP(p[d][i], 0);
    for (lim = 1; lim <= tota + totb; lim <<= 1)
      ;
    for (int i = (0), iE = (lim - 1); i <= iE; i++)
      pp[i] = ((pp[i >> 1] >> 1) | ((i & 1) * (lim >> 1)));
    for (int i = (tota + 1), iE = (lim - 1); i <= iE; i++) A[i] = CP(0, 0);
    for (int i = (totb + 1), iE = (lim - 1); i <= iE; i++) B[i] = CP(0, 0);
    FFT(A, 1), FFT(B, 1);
    for (int i = (0), iE = (lim - 1); i <= iE; i++) A[i] = A[i] * B[i];
    FFT(A, -1);
    for (int i = (1), iE = (r - mid); i <= iE; i++)
      calc[d][i + mid] += A[i + tota].x;
  }
}
void Divide(int l, int r) {
  if (l == r) {
    for (int j = (1), jE = (m); j <= jE; j++)
      ans[fu[j]][l] = min(ans[fu[j]][l], calc[j][l] + fval[j]);
    return;
  }
  int mid = (l + r) / 2;
  Divide(l, mid);
  Solve(l, mid, r);
  Divide(mid + 1, r);
}
int main() {
  n = read(), m = read(), t = read(), x = read();
  dis[n] = 0;
  for (int i = (1), iE = (n - 1); i <= iE; i++) dis[i] = inf;
  for (int i = (1), iE = (n - 1); i <= iE; i++)
    for (int j = (t), jE = (t * 2); j <= jE; j++) ans[i][j] = inf;
  for (int i = (1), iE = (m); i <= iE; i++) {
    fu[i] = read(), fv[i] = read(), fval[i] = read();
    for (int j = (1), jE = (t); j <= jE; j++) p[i][j] = 1. * read() / 100000;
  }
  for (int i = (1), iE = (n); i <= iE; i++)
    for (int j = (1), jE = (m); j <= jE; j++)
      dis[fu[j]] = min(dis[fu[j]], dis[fv[j]] + fval[j]);
  for (int i = (1), iE = (n); i <= iE; i++)
    for (int j = (0), jE = (t - 1); j <= jE; j++) ans[i][j] = dis[i] + x;
  Solve(0, t - 1, t * 2);
  Divide(t, t * 2);
  printf("%.10lf\n", ans[1][2 * t]);
  return 0;
}
