#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while ((c = getchar()) == ' ')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
struct com {
  double x, y;
  inline com operator+(const com &z) const { return (com){x + z.x, y + z.y}; }
  inline com operator-(const com &z) const { return (com){x - z.x, y - z.y}; }
  inline com operator*(const com &z) const {
    return (com){x * z.x - y * z.y, y * z.x + x * z.y};
  }
  inline com operator/(const double &z) const { return (com){x / z, y / z}; }
} a[65536], b[65536];
int rev[65536];
const double dinf = 1e18, pi = acos(-1);
double _[65536], __[65536], ___[65536];
int n, m, t, px[105], py[105];
double fine, dis[105][105], pz[105], p[105][20005], dp[55][20005],
    sum[105][20005];
inline int init(int n) {
  int i, lg = -1, len = 1;
  while (len < n) {
    len <<= 1;
    lg++;
  }
  for (((i)) = (1); ((i)) <= ((len - 1)); ((i))++)
    rev[i] = ((rev[i >> 1] >> 1) | ((i & 1) << lg));
  return len;
}
inline void fft(com *a, int len, int op) {
  int i, j, k;
  for ((i) = (0); (i) <= (len - 1); (i)++)
    if (rev[i] < i) swap(a[i], a[rev[i]]);
  for (i = 1; i < len; i <<= 1) {
    com t = (com){cos(pi / i), op * sin(pi / i)};
    for (j = 0; j < len; j += i + i) {
      com s = (com){1, 0};
      for ((k) = (0); (k) <= (i - 1); (k)++) {
        com x = a[j + k], y = a[i + j + k] * s;
        a[j + k] = x + y;
        a[i + j + k] = x - y;
        s = s * t;
      }
    }
  }
  if (op == -1)
    for ((i) = (0); (i) <= (len - 1); (i)++) a[i] = a[i] / len;
}
inline void mul(int len) {
  int i, j;
  if (len <= 512) {
    for ((i) = (0); (i) <= (len - 1); (i)++) {
      _[i] = a[i].x;
      __[i] = b[i].x;
      ___[i] = 0;
    }
    for ((i) = (0); (i) <= (len - 1); (i)++)
      for ((j) = (i); (j) <= (len - 1); (j)++) ___[j] += _[i] * __[j - i];
    for ((i) = (0); (i) <= (len - 1); (i)++) a[i] = (com){___[i], 0};
    return;
  }
  fft(a, len, 1);
  fft(b, len, 1);
  for ((i) = (0); (i) <= (len - 1); (i)++) a[i] = a[i] * b[i];
  fft(a, len, -1);
}
void solve(int l, int r) {
  int i, j, mid = (l + r) / 2;
  if (l == r) {
    for (((i)) = (1); ((i)) <= ((m)); ((i))++)
      dp[px[i]][l] = min(dp[px[i]][l], sum[i][l] + pz[i]);
    return;
  }
  solve(mid + 1, r);
  int len = init(r - mid + r - l);
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    for ((j) = (0); (j) <= (len - 1); (j)++) a[j] = b[j] = (com){0, 0};
    for ((j) = (mid + 1); (j) <= (r); (j)++)
      a[j - mid - 1] = (com){dp[py[i]][j], 0};
    for (((j)) = (1); ((j)) <= ((r - l)); ((j))++)
      b[r - l - j] = (com){p[i][j], 0};
    mul(len);
    for ((j) = (l); (j) <= (mid); (j)++) sum[i][j] += a[j - mid - 1 + r - l].x;
  }
  solve(l, mid);
}
int main() {
  int i, j, k;
  scanf("%d%d%d%lf", &n, &m, &t, &fine);
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    cin >> px[i] >> py[i] >> pz[i];
    for (((j)) = (1); ((j)) <= ((t)); ((j))++) {
      scanf("%lf", &p[i][j]);
      p[i][j] /= 100000.0;
    }
  }
  for (((i)) = (1); ((i)) <= ((n)); ((i))++)
    for (((j)) = (1); ((j)) <= ((n)); ((j))++) dis[i][j] = dinf;
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) dis[i][i] = 0;
  for (((i)) = (1); ((i)) <= ((m)); ((i))++)
    dis[px[i]][py[i]] = min(dis[px[i]][py[i]], pz[i]);
  for (((k)) = (1); ((k)) <= ((n)); ((k))++)
    for (((i)) = (1); ((i)) <= ((n)); ((i))++)
      for (((j)) = (1); ((j)) <= ((n)); ((j))++)
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  for (((i)) = (1); ((i)) <= ((n)); ((i))++)
    for ((j) = (0); (j) <= (t); (j)++) dp[i][j] = (i < n ? dinf : 0);
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) dp[i][t + 1] = fine + dis[i][n];
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    double pre = 0;
    for (((j)) = (1); ((j)) <= ((t)); ((j))++) {
      pre += p[i][t - j + 1];
      sum[i][j] += dp[py[i]][t + 1] * pre;
    }
  }
  solve(0, t);
  printf("%.18f\n", dp[1][0]);
  return 0;
}
