#include <bits/stdc++.h>
using namespace std;
const int MAX = 500005;
const double PI = acos(-1);
inline int read() {
  int bj = 0, hhh = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') bj = 1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    hhh = (hhh << 1) + (hhh << 3) + (ch - '0');
    ch = getchar();
  }
  return bj ? -hhh : hhh;
}
int n, m, t, X;
int xx[205], yy[205], vv[205];
double f[205][50005], g[205][50005], p[205][50005];
struct XJS {
  int next, to, v;
} e[205];
int cnt, h[55], d[55], vis[55];
queue<int> q;
void md(int x, int y, int v) {
  cnt++;
  e[cnt].next = h[x];
  e[cnt].to = y;
  e[cnt].v = v;
  h[x] = cnt;
}
void Spfa(int s) {
  memset(d, 0x7f, sizeof(d));
  q.push(s);
  vis[s] = 1;
  d[s] = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    vis[x] = 0;
    for (int i = h[x]; i; i = e[i].next) {
      int y = e[i].to;
      if (d[y] > d[x] + e[i].v) {
        d[y] = d[x] + e[i].v;
        if (!vis[y]) q.push(y), vis[y] = 1;
      }
    }
  }
}
int rev[MAX];
struct cp {
  double x, y;
  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}; }
  cp operator*(const cp& a) const {
    return (cp){x * a.x - y * a.y, x * a.y + y * a.x};
  }
} a[MAX], b[MAX], w[MAX];
int make(int n) {
  int bj = log2(n) + 1;
  n = (1 << bj);
  for (int i = 1; i < n; i++) rev[i] = rev[i >> 1] >> 1 | ((i & 1) << (bj - 1));
  return n;
}
void FFT(cp* a, int n, int bj) {
  for (int i = 0; i < n; i++)
    if (rev[i] < i) swap(a[i], a[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    cp wn = (cp){cos(PI / i), bj * sin(PI / i)};
    w[0] = (cp){1, 0};
    for (int j = 1; j < i; j++) w[j] = w[j - 1] * wn;
    for (int j = 0; j < n; j += (i << 1)) {
      for (int k = 0; k < i; k++) {
        cp x = a[j + k], y = a[j + k + i] * w[k];
        a[j + k] = x + y;
        a[j + k + i] = x - y;
      }
    }
  }
}
void CDQ_Div(int l, int r) {
  if (l == r) {
    for (int i = 1; i <= m; i++) f[xx[i]][l] = min(f[xx[i]][l], g[i][l]);
    return;
  }
  int mid = (l + r) >> 1;
  CDQ_Div(mid + 1, r);
  int n = make(r - l);
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j < r - mid; j++)
      a[j].x = f[yy[i]][j + mid + 1], a[j].y = 0;
    for (int j = 0; j < r - l; j++) b[j].x = p[i][j + l + t - r], b[j].y = 0;
    for (int j = r - mid; j < n; j++) a[j].x = a[j].y = 0;
    for (int j = r - l; j < n; j++) b[j].x = b[j].y = 0;
    FFT(a, n, 1);
    FFT(b, n, 1);
    for (int j = 0; j < n; j++) a[j] = a[j] * b[j];
    FFT(a, n, -1);
    for (int j = l; j <= mid; j++) g[i][j] += a[j + r - l - mid - 1].x / n;
  }
  CDQ_Div(l, mid);
}
int main() {
  n = read();
  m = read();
  t = read();
  X = read();
  for (int i = 1; i < n; i++)
    for (int j = 0; j <= t; j++) f[i][j] = 1e9;
  for (int i = 1; i <= m; i++) {
    xx[i] = read();
    yy[i] = read();
    vv[i] = read();
    md(yy[i], xx[i], vv[i]);
    for (int j = 1; j <= t; j++) p[i][j] = read() / 100000.0;
    reverse(p[i], p[i] + t + 1);
    for (int j = 1; j <= t; j++) g[i][j] = g[i][j - 1] + p[i][j - 1];
  }
  Spfa(n);
  for (int i = 1; i <= m; i++)
    for (int j = 0; j <= t; j++) g[i][j] = g[i][j] * (d[yy[i]] + X) + vv[i];
  CDQ_Div(0, t);
  printf("%.6lf\n", min(f[1][0], 1.0 * d[1] + 1.0 * X));
  return 0;
}
