#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 29;
int N, X, Y, G[14][14];
int tsp[1 << 14][14];
vector<tuple<int, int, int> > vs[14];
int dp[1 << 14][1001];
int main() {
  cin >> N >> X >> Y;
  for (int i = 0; i < N; i++) {
    int K;
    cin >> K;
    for (int j = 0; j < K; j++) {
      int a, b, c;
      cin >> a >> b >> c;
      vs[i].emplace_back(a, b, c);
    }
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      cin >> G[i][j];
    }
  }
  fill_n(*tsp, (1 << 14) * 14, INF);
  for (int i = 0; i < N; i++) tsp[1 << i][i] = G[0][i];
  for (int i = 0; i < (1 << N); i++) {
    for (int j = 0; j < N; j++) {
      for (int k = 0; k < N; k++) {
        tsp[i | (1 << k)][k] = min(tsp[i | (1 << k)][k], tsp[i][j] + G[j][k]);
      }
    }
  }
  for (int i = 0; i < N; i++) {
    for (auto &p : vs[i]) {
      int a, b, c;
      tie(a, b, c) = p;
      for (int k = 0; c > 0; k++) {
        int key = min(c, (int)(1 << k));
        c -= key;
        for (int j = 1000; j >= key * a; j--) {
          dp[1 << i][j] = max(dp[1 << i][j], dp[1 << i][j - key * a] + key * b);
        }
      }
    }
    for (int j = 1; j <= 1000; j++) {
      dp[1 << i][j] = max(dp[1 << i][j], dp[1 << i][j - 1]);
    }
  }
  int ret = 0;
  vector<int> st;
  for (int i = 1; i < 1 << N; i++) st.emplace_back(i);
  sort(begin(st), end(st), [&](int a, int b) {
    return (__builtin_popcount(a) < __builtin_popcount(b));
  });
  for (auto &i : st) {
    if (__builtin_popcount(i) > 1) {
      int idx = -1;
      for (int j = 0; j < N; j++) {
        if ((i >> j) & 1) {
          idx = 1 << j;
          break;
        }
      }
      int bit = i ^ idx;
      for (int j = 1000; j >= 0; j--) {
        for (int k = 1000; k >= 0; k--) {
          if (j + k > 1000) continue;
          dp[i][j + k] = max(dp[i][j + k], dp[bit][j] + dp[idx][k]);
        }
      }
      for (int j = 1; j <= 1000; j++) {
        dp[i][j] = max(dp[i][j], dp[i][j - 1]);
      }
    }
    int rest = X - tsp[i][0];
    if (rest < 0) continue;
    int cost = min(rest, Y);
    ret = max(ret, dp[i][cost]);
  }
  cout << ret << endl;
}
