#include <bits/stdc++.h>
using namespace std;
const double PI = 3.1415926535897932384626433832795;
struct base {
  double first, second;
  base() {
    first = 0;
    second = 0;
  }
  base(double _x) {
    first = _x;
    second = 0;
  }
  base(double _x, double _y) {
    first = _x;
    second = _y;
  }
  inline base operator+(const base &o) const {
    return base(first + o.first, second + o.second);
  }
  inline base operator-(const base &o) const {
    return base(first - o.first, second - o.second);
  }
  inline base operator*(const base &o) const {
    return base(first * o.first - second * o.second,
                first * o.second + second * o.first);
  }
  inline base operator/(const double n) const {
    return base(first / n, second);
  }
  inline void operator+=(const base &o) {
    first += o.first, second += o.second;
  }
  inline void operator-=(const base &o) {
    first -= o.first, second -= o.second;
  }
  inline void operator*=(const base &o) {
    double ax = first * o.first - second * o.second,
           ay = first * o.second + second * o.first;
    first = ax, second = ay;
  }
  inline void operator/=(const long long n) { first /= n; }
};
base p1[100005], p2[100005], p3[100005];
const long long R = 30;
base root[R], iroot[R];
void init() {
  for (long long i = 1; i < R; i++) {
    double ang = 2 * PI / (1 << i);
    root[i] = base(cos(ang), sin(ang));
    iroot[i] = base(cos(-ang), sin(-ang));
  }
}
long long rev[1 << 15];
void bit(long long k, long long n) {
  long long res;
  for (long long i = 0; i < n; i++) {
    res = 0;
    for (long long j = 0; j < k; j++) {
      if ((i >> j) & 1) {
        res |= 1 << (k - j - 1);
      }
    }
    rev[i] = res;
  }
}
void fft(base *a, bool invert, long long n) {
  for (long long i = 0; i < n; i++) {
    if (rev[i] > i) {
      swap(a[i], a[rev[i]]);
    }
  }
  for (long long len = 2, pp = 1; len <= n; len <<= 1, pp++) {
    base wlen = invert ? iroot[pp] : root[pp];
    for (long long i = 0; i < n; i += len) {
      base w(1);
      for (long long j = 0; j < len / 2; j++) {
        base u = a[i + j], v = a[i + j + len / 2] * w;
        a[i + j] = u + v;
        a[i + j + len / 2] = u - v;
        w *= wlen;
      }
    }
  }
  if (invert) {
    for (long long i = 0; i < n; i++) {
      a[i] /= n;
    }
  }
}
long long p[102][40004];
long long presum[102][40004];
vector<pair<long long, long long> > adj[52];
double w[52][52];
double we[102][40004];
double c[102][40004];
double wv[52][40004];
vector<pair<long long, long long> > edges;
void multiply(long long first, long long n, long long lg, long long e) {
  if (n <= 16) {
    long long second = edges[e].second;
    for (long long i = 0; i < n; i++) {
      for (long long j = 0; j < n; j++) {
        c[e][i + first + j + 1] += wv[second][i + first - n] * p[e][j + n + 1];
      }
    }
  } else {
    fill(p1 + n, p1 + n + n, 0);
    fill(p2 + n, p2 + n + n, 0);
    fill(p3, p3 + n + n, 0);
    for (long long k = 0; k < n; k++) {
      p1[k] = wv[edges[e].second][k + first - n];
      p2[k] = p[e][k + n + 1];
    }
    n <<= 1;
    lg++;
    bit(lg, n);
    fft(p1, false, n);
    fft(p2, false, n);
    for (long long k = 0; k < n; k++) p3[k] = p1[k] * p2[k];
    fft(p3, true, n);
    for (long long k = 0; k < n; k++) c[e][first + 1 + k] += p3[k].first;
  }
}
long long n, m, t, first;
vector<long long> weight;
void solve() {
  init();
  cin >> n >> m >> t >> first;
  for (long long i = 1; i < n + 1; i++) {
    for (long long j = 1; j < n + 1; j++) {
      if (i == j)
        w[i][j] = 0;
      else
        w[i][j] = 1e15;
    }
  }
  for (long long i = 0; i < n + 1; i++) {
    for (long long k = 0; k < t + 1; k++) {
      wv[i][k] = 1e15;
    }
  }
  for (long long i = 0; i < m; i++) {
    long long a, b, d;
    cin >> a >> b >> d;
    w[a][b] = d;
    adj[a].push_back({b, i});
    edges.push_back({a, b});
    weight.push_back(d);
    for (long long j = 1; j < t + 1; j++) {
      cin >> p[i][j];
      presum[i][j] = p[i][j] + presum[i][j - 1];
    }
  }
  for (long long k = 1; k < n + 1; k++) {
    for (long long i = 1; i < n + 1; i++) {
      for (long long j = 1; j < n + 1; j++) {
        w[i][j] = min(w[i][k] + w[k][j], w[i][j]);
      }
    }
  }
  for (long long i = 1; i < n + 1; i++) {
    wv[i][0] = w[i][n] + first;
  }
  wv[n][0] = 0;
  for (long long i = 0; i < t + 1; i++) {
    for (long long j = 0; j < m; j++) {
      c[j][i + 1] += wv[edges[j].second][i] * p[j][1];
      c[j][i + 2] += wv[edges[j].second][i] * p[j][2];
    }
    for (long long j = 1; j < n; j++) {
      wv[j][i + 1] = w[j][n] + first;
    }
    wv[n][i + 1] = 0;
    for (long long e = 0; e < m; e++) {
      long long j = 2, lg = 1;
      while (i and i % j == 0) {
        multiply(i, j, lg, e);
        j <<= 1;
        lg++;
      }
      we[e][i + 1] = c[e][i + 1] + (presum[e][t] - presum[e][i + 1]) *
                                       (w[edges[e].second][n] + first);
      we[e][i + 1] /= 100000;
      we[e][i + 1] += weight[e];
    }
    for (long long j = 1; j < n; j++) {
      for (auto k : adj[j]) {
        wv[j][i + 1] = min(wv[j][i + 1], we[k.second][i + 1]);
      }
    }
  }
  cout << wv[1][t] << '\n';
}
signed main() {
  cout << fixed << setprecision(6);
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
