#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 533333, _N = 107, _M = 207, _T = 20007 << 1;
const double pi = acos(-1.00), dinf = 1e99;
struct cxk {
  double r, i;
  cxk(double r_ = 0, double i_ = 0) { r = r_, i = i_; }
  inline friend cxk operator+(cxk a, cxk b) {
    return cxk(a.r + b.r, a.i + b.i);
  }
  inline friend cxk operator-(cxk a, cxk b) {
    return cxk(a.r - b.r, a.i - b.i);
  }
  inline friend cxk operator*(cxk a, cxk b) {
    return cxk(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
  }
  inline friend cxk operator/(cxk a, double b) { return cxk(a.r / b, a.i / b); }
};
int rev[_];
int fftmake(int n) {
  int nn = 1, lg = 0;
  while (nn <= n) nn <<= 1, lg++;
  rev[0] = 0;
  for (int i = 1; i < nn; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg - 1));
  return nn;
}
void fft(cxk a[], int nn, int dir) {
  for (int i = 0; i < nn; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int i = 1; i < nn; i <<= 1) {
    cxk g = cxk(cos(pi / i), dir * sin(pi / i));
    for (int j = 0; j < nn; j += i + i) {
      cxk ig = cxk(1, 0), x, y;
      for (int k = 0; k < i; k++, ig = ig * g)
        x = a[j + k], y = ig * a[j + k + i], a[j + k] = x + y,
        a[j + k + i] = x - y;
    }
  }
  if (dir < 0)
    for (int i = 0; i < nn; i++) a[i] = a[i] / nn;
}
int n, m, tim, tt, per;
int ea[_M], eb[_M], ev[_M];
double gai[_M][_T], dis[_N][_N];
double f[_N][_T], g[_N][_T];
void install(int l, int r) {
  int mid = (l + r) >> 1;
  for (int i = 1; i <= m; i++) {
    static cxk pa[_], pb[_];
    int nn = fftmake(r - l + r - mid - 1);
    for (int j = 0; j < nn; j++) pa[j] = pb[j] = cxk(0, 0);
    for (int j = mid + 1; j <= r; j++) pa[j - mid - 1] = cxk(f[eb[i]][j], 0);
    for (int j = 1; j <= r - l; j++) pb[r - l - j] = cxk(gai[i][j], 0);
    fft(pa, nn, 1), fft(pb, nn, 1);
    for (int j = 0; j < nn; j++) pa[j] = pa[j] * pb[j];
    fft(pa, nn, -1);
    for (int j = l; j <= mid; j++) g[i][j] += pa[r - l + j - mid - 1].r;
  }
}
void dfs(int l, int r) {
  if (l == r) {
    for (int i = 1; i <= m; i++)
      f[ea[i]][l] = min(f[ea[i]][l], g[i][l] + ev[i]);
    return;
  }
  int mid = (l + r) >> 1;
  dfs(mid + 1, r), install(l, r), dfs(l, mid);
}
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), m = ty(), tim = ty(), per = ty();
  tt = tim << 1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) dis[i][j] = i == j ? 0 : dinf;
  for (int i = 1, a, b, c; i <= m; i++) {
    a = ty(), b = ty(), c = ty();
    ea[i] = a, eb[i] = b, ev[i] = c;
    dis[a][b] = min(dis[a][b], c);
    for (int j = 1; j <= tim; j++) gai[i][j] = ty() / 100000.00;
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  for (int i = 0; i <= tt; i++) f[n][i] = i > tim ? per : 0;
  for (int i = 1; i < n; i++)
    for (int j = 0; j <= tt; j++) f[i][j] = j > tim ? (dis[i][n] + per) : dinf;
  install(1, tt), dfs(0, tim);
  cout << setprecision(12) << fixed << f[1][0] << lf;
  return 0;
}
