Problem: Problem

Tomorrow is finally the day of the excursion to Maizu Elementary School. Gatcho, who attends Maizu Elementary School, noticed that he had forgotten to buy tomorrow's sweets because he was so excited. Gaccho wants to stick to sweets so that he can enjoy the excursion to the fullest.


Gaccho gets a $ X $ yen allowance from his mother and goes to buy sweets. However, according to the rules of elementary school, the total amount of sweets to bring for an excursion is limited to $ Y $ yen, and if it exceeds $ Y $ yen, all sweets will be taken up by the teacher.

There are $ N $ towns in the school district where Gaccho lives, and each town has one candy store. Each town is assigned a number from 1 to $ N $, and Gaccho lives in town 1. Each candy store sells several sweets, and the price per one and the satisfaction level that you can get for each purchase are fixed. However, the number of sweets in stock is limited. Also, Gaccho uses public transportation to move between the two towns, so to move directly from town $ i $ to town $ j $, you only have to pay $ d_ {i, j} $ yen. It takes.

At first, Gaccho is in Town 1. Gaccho should make sure that the sum of the total cost of moving and the price of the sweets you bought is within $ X $ yen, and the total price of the sweets you bought is within $ Y $ yen. I'm going to buy sweets. You must have arrived at Town 1 at the end. Gaccho wants to maximize the total satisfaction of the sweets he bought. Find the total satisfaction when you do the best thing.

Constraints

The input satisfies the following conditions.

* $ 1 \ leq N \ leq 14 $
* $ 1 \ leq X \ leq 10000 $
* $ 1 \ leq Y \ leq min (1000, X) $
* $ 1 \ leq K \ leq 300 $
* $ 1 \ leq a_i \ leq 1000 $
* $ 1 \ leq b_i \ leq 1000 $
* $ 1 \ leq c_i \ leq 1000 $
* $ 0 \ leq d_ {i, j} \ leq 10000 $
* $ d_ {i, i} = 0 $

Input

All inputs are given as integers in the following format:

$ N $ $ X $ $ Y $
Information on candy stores in town 1
Information on candy stores in town 2
...
Information on candy stores in town $ N $
$ d_ {1,1} $ $ d_ {1,2} $ ... $ d_ {1, N} $
$ d_ {2,1} $ $ d_ {2,2} $ ... $ d_ {2, N} $
...
$ d_ {N, 1} $ $ d_ {N, 2} $ ... $ d_ {N, N} $


On the first line, the number of towns $ N $, the amount of money you have $ X $, and the maximum amount you can use to buy sweets $ Y $ are given, separated by blanks.
From the second line, information on each $ N $ candy store is given.
In the following $ N $ row and $ N $ column, the amount $ d_ {i, j} $ required to go back and forth between town $ i $ and town $ j $ is given, separated by blanks.


Information on candy stores in each town is given in the following format.

$ K $
$ a_1 $ $ b_1 $ $ c_1 $
$ a_2 $ $ b_2 $ $ c_2 $
...
$ a_K $ $ b_K $ $ c_K $


The first line gives $ K $, the number of types of sweets sold at the candy store. In the following $ K $ line, the price of one candy $ a_i $, the satisfaction level $ b_i $ per candy, and the number of stocks $ c_i $ are given, separated by blanks.

Output

Output the maximum value of the total satisfaction level on one line.

Examples

Input

1 10 10
3
1 10 1
2 20 2
3 30 3
0


Output

100


Input

2 10 10
3
1 10 1
2 20 2
3 30 3
1
5 200 1
0 2
3 0


Output

200


Input

3 10 10
1
1 1 1
1
3 3 3
1
5 5 5
0 1 0
1 0 0
0 1 0


Output

10


Input

4 59 40
1
7 6 3
1
10 3 9
2
9 8 5
7 6 10
4
8 2 9
1 7 1
7 7 9
1 2 3
0 28 7 26
14 0 10 24
9 6 0 21
9 24 14 0


Output

34

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

using vi = vector<int>;
using vvi = vector<vi>;

const int Y = 1010;
const int INF = 19191919;

struct Town{
    int k;
    vi a,b,c;

    int dp[Y];

    Town(){}

    void init(){
        // read
        cin >>k;
        a.assign(k,0);
        b.assign(k,0);
        c.assign(k,0);
        rep(i,k) scanf(" %d %d %d", &a[i], &b[i], &c[i]);

        // make dp table
        rep(i,Y) dp[i] = -INF;
        dp[0] = 0;
        rep(i,k){
            int rem = c[i];
            int num = 1;

            while(rem>0){
                for(int j=Y-1; j>=0; --j)if(dp[j] > -INF){
                    int nx = j+a[i]*num;
                    if(nx<Y) dp[nx] = max(dp[nx], dp[j]+b[i]*num);
                }

                rem -= num;
                num *= 2;
                if(num > rem) num = rem;
            }
        }

        rep(i,Y-1) dp[i+1] = max(dp[i+1], dp[i]);
    }

    int MAX(int yen){
        return dp[yen];
    }
};

int main(){
    int n,x,y;
    scanf(" %d %d %d", &n, &x, &y);

    vector<Town> t(n);
    rep(i,n) t[i].init();

    vvi d(n, vi(n));
    rep(i,n)rep(j,n) cin >>d[i][j];

    // Floyd-Warshall
    rep(k,n)rep(i,n)rep(j,n) d[i][j] = min(d[i][j], d[i][k]+d[k][j]);

    // calc move cost
    vvi dp(1<<n, vi(n,INF));
    dp[1][0] = 0;
    rep(mask,1<<n)rep(i,n)if(mask>>i&1){
        rep(j,n){
            if(mask>>j&1) continue;
            int nmask = mask|(1<<j);
            dp[nmask][j] = min(dp[nmask][j], dp[mask][i]+d[i][j]);
        }
    }

    vi move_cost(1<<n,INF);
    rep(mask,1<<n){
        rep(i,n) move_cost[mask] = min(move_cost[mask], dp[mask][i]+d[i][0]);
    }

    // two groups
    int A = n/2, B = n-A;

    // groupA : 0 ~ A-1
    vvi dpa(1<<A, vi(Y, -INF));
    dpa[0][0] = 0;
    rep(i,A){
        rep(mask,1<<i){
            int nmask = mask|(1<<i);

            int tidx = i;
            rep(j,Y)if(dp[mask][j] > -INF){
                rep(k,Y){
                    int nj = j+k;
                    if(nj >= Y) break;

                    dpa[nmask][nj] = max(dpa[nmask][nj], dpa[mask][j]+t[tidx].MAX(k));
                }
            }
        }
    }

    // groupB : A ~ A+B-1
    vvi dpb(1<<B, vi(Y, -INF));
    dpb[0][0] = 0;
    rep(i,B){
        rep(mask,1<<i){
            int nmask = mask|(1<<i);

            int tidx = A+i;
            rep(j,Y)if(dp[mask][j] > -INF){
                rep(k,Y){
                    int nj = j+k;
                    if(nj >= Y) break;

                    dpb[nmask][nj] = max(dpb[nmask][nj], dpb[mask][j]+t[tidx].MAX(k));
                }
            }
        }
    }

    // check all masks
    int ans = 0;

    int AA = (1<<A)-1, BB = (1<<B)-1;
    rep(mask,1<<n){
        int amask = mask&AA;
        int bmask = (mask>>A)&BB;

        int cost = move_cost[mask];
        // use ai yen for group A
        rep(ai,y+1){
            int bi = min(y-ai, x-cost-ai);
            if(bi<0) break;

            ans = max(ans, dpa[amask][ai]+dpb[bmask][bi]);
        }
    }

    printf("%d\n", ans);
    return 0;
}