#include <bits/stdc++.h>
using namespace std;
const long long inff = 0x3f3f3f3f3f3f3f3f;
const int N = 108;
const int M = 4e4 + 8;
int n, m, dis[N][N], t, x, y, X, z, nn, mm;
double dp[N][M], f[N][M], p[N][M];
struct as {
  int x, y, z;
} e[N];
struct CP {
  double x, y;
  CP() {}
  CP(double a, double b) : x(a), y(b) {}
  CP operator+(const CP &r) const { return CP(x + r.x, y + r.y); }
  CP operator-(const CP &r) const { return CP(x - r.x, y - r.y); }
  CP operator*(const CP &r) const {
    return CP(x * r.x - y * r.y, x * r.y + y * r.x);
  }
} a[M << 1], b[M << 1];
inline void fft(CP a[], int f) {
  int i, j, k;
  for (i = j = 0; i < n; i++) {
    if (i > j) swap(a[i], a[j]);
    for (k = n >> 1; (j ^= k) < k; k >>= 1)
      ;
  }
  for (int d = 0; (1 << d) < n; d++) {
    int m = 1 << d, m2 = m << 1;
    double o = acos(-1) * 2 / m2 * f;
    CP _w(cos(o), sin(o));
    for (int i = 0; i < n; i += m2) {
      CP w(1, 0);
      for (int j(0); j <= (m - 1); ++j) {
        CP &A = a[i + j + m], &B = a[i + j], t = w * A;
        A = B - t;
        B = B + t;
        w = w * _w;
      }
    }
  }
  if (f == -1)
    for (int i(0); i <= (n); ++i) a[i].x /= n;
}
void solve(int l, int r, int mid) {
  m = r - l + 2, n = r - mid + 1;
  for (m = n + m, n = 1; n <= m; n <<= 1)
    ;
  for (int j(1); j <= (mm); ++j) {
    for (int i(0); i <= (n); ++i) a[i] = b[i] = CP(0, 0);
    for (int i(1); i <= (r - mid); ++i) a[i].x = dp[e[j].y][r - i + 1];
    for (int i(0); i <= (r - l + 1); ++i) b[i].x = p[j][i];
    fft(a, 1), fft(b, 1);
    for (int i(0); i <= (n); ++i) a[i] = a[i] * b[i];
    fft(a, -1);
    for (int i(l); i <= (mid); ++i) f[j][i] += a[r - i + 1].x;
  }
}
void cdq(int l, int r) {
  if (l == r) {
    for (int i(1); i <= (mm); ++i)
      dp[e[i].x][l] = min(dp[e[i].x][l], f[i][l] + e[i].z);
    return;
  }
  int mid = (l + r) >> 1;
  cdq(mid + 1, r);
  solve(l, r, mid);
  cdq(l, mid);
}
int main() {
  cin.tie(0);
  cout.tie(0);
  cin >> nn >> mm >> t >> X;
  memset(dis, int(0x3f3f3f3f), sizeof(dis));
  for (int i(1); i <= (mm); ++i) {
    cin >> x >> y >> z;
    e[i] = as{x, y, z};
    dis[x][y] = min(dis[x][y], z);
    for (int j(1); j <= (t); ++j) {
      scanf("%d", &x);
      p[i][j] = 1.0 * x / 100000.0;
    }
  }
  for (int k(1); k <= (nn); ++k)
    for (int i(1); i <= (nn); ++i)
      for (int j(1); j <= (nn); ++j)
        dis[i][j] = min(dis[i][k] + dis[k][j], dis[i][j]);
  for (int i(1); i <= (nn); ++i) dis[i][i] = 0;
  for (int i(1); i <= (nn); ++i)
    for (int j(0); j <= (2 * t); ++j)
      dp[i][j] = (j > t) ? dis[i][nn] + X : int(0x3f3f3f3f);
  for (int i(0); i <= (t); ++i) dp[nn][i] = 0;
  solve(0, 2 * t, t);
  cdq(0, t);
  printf("%.6lf\n", dp[1][0]);
  return 0;
}
