Problem: Tanya is now five so all her friends gathered together to celebrate her birthday. There are n children on the celebration, including Tanya.

The celebration is close to its end, and the last planned attraction is gaming machines. There are m machines in the hall, they are numbered 1 through m. Each of the children has a list of machines he wants to play on. Moreover, for each of the machines he knows the exact time he wants to play on it. For every machine, no more than one child can play on this machine at the same time.

It is evening already, so every adult wants to go home. To speed up the process, you can additionally rent second copies of each of the machines. To rent the second copy of the j-th machine, you have to pay pj burles. After you rent a machine, you can use it for as long as you want.

How long it will take to make every child play according to his plan, if you have a budget of b burles for renting additional machines? There is only one copy of each machine, so it's impossible to rent a third machine of the same type.

The children can interrupt the game in any moment and continue it later. If the i-th child wants to play on the j-th machine, it is allowed after you rent the copy of the j-th machine that this child would play some part of the time on the j-th machine and some part of the time on its copy (each of these parts could be empty). The interruptions and changes take no time and can be performed in any integer moment of time. Of course, a child can't play on more than one machine at the same time.

Remember, that it is not needed to save money (no one saves money at the expense of children happiness!), it is needed to minimize the latest moment of time some child ends his game.

Input

The first line contains three integers n, m and b (1 ≤ n ≤ 40, 1 ≤ m ≤ 10, 0 ≤ b ≤ 106) — the number of children, the number of gaming machines and the budget for renting additional machines.

The second line contains m integers p1, p2, ..., pm (1 ≤ pj ≤ 106), where pj is the rent price for the second copy of the j-th machine.

n lines follow, i-th of them describes the wishes of the i-th child. The line starts with an integer ki (0 ≤ ki ≤ m) — the number of machines, the i-th child wants to play on. Then there are ki pairs in the line, the y-th of them is xiy, tiy. It means that, the i-th child wants to play tiy (1 ≤ tiy ≤ 2500) minutes on the xiy-th (1 ≤ xiy ≤ m) machine. In each of these n lines the values xiy are distinct.

Output

In the first line print the minimum time in which all the children can finish their games.

In the second line print a string of length m consisting of zeros and ones. The j-th character is '1', if the copy of j-th machine should be rated, and '0' otherwise.

In the third line print integer g (0 ≤ g ≤ 106) — the total number of time segments of continuous playing for all of the children. Then in g lines print the segments as four integers i, j, s, d, meaning that the i-th child was playing on the j-th machine or its copy from the time moment s (s ≥ 0) for d minutes (d ≥ 1). You can print these lines in arbitrary order.

If there are multiple answers, print any of them.

Examples

Input

2 2 100
3 7
2 1 3 2 1
2 1 3 2 1


Output

4
10
8
1 1 0 1
2 2 0 1
1 1 1 1
2 1 1 1
2 1 2 1
1 1 2 1
1 2 3 1
2 1 3 1


Input

3 2 15
11 7
2 2 10 1 5
1 2 20
2 1 4 2 3


Output

20
01
17
2 2 0 4
2 2 4 1
1 1 5 2
2 2 5 2
1 2 7 5
2 2 7 5
2 2 12 1
1 2 12 1
3 1 13 4
2 2 13 4
1 2 13 4
1 1 17 2
3 2 17 2
2 2 17 2
1 1 19 1
2 2 19 1
3 2 19 1

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int N = 70;
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
struct dat {
  int i, j, s, d;
};
int mat_r[N], mat_l[N], n, m, b, id[N], sx[N], sy[N], p[N], w[N][N];
bool dup[N], vis[N];
vector<dat> opt;
bool find(int u) {
  for (int v = 1; v <= n + m; v++)
    if (w[u][v] > 0 && !vis[v]) {
      vis[v] = 1;
      if (!mat_r[v] || find(mat_r[v])) {
        mat_r[v] = u;
        return 1;
      }
    }
  return 0;
}
bool cmp(int a, int b) { return sy[a] < sy[b]; }
int main() {
  cin >> n >> m >> b;
  for (int i = 1; i <= m; i++) p[i] = gi();
  for (int i = 1; i <= n; i++) {
    int k = gi();
    while (k--) {
      int id = gi(), t = gi();
      w[i][id] = t;
      sx[i] += t;
      sy[id] += t;
    }
  }
  for (int i = 1; i <= m; i++) id[i] = i;
  sort(id + 1, id + m + 1, cmp);
  int pref = 0;
  for (int i = m; i; i--) {
    if (b >= p[id[i]])
      b -= p[id[i]], dup[id[i]] = 1;
    else {
      pref = i;
      break;
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) ans = max(ans, sx[i]);
  for (int i = 1; i <= pref; i++) ans = max(ans, sy[id[i]]);
  for (int i = pref + 1; i <= m; i++) ans = max(ans, (sy[id[i]] + 1) / 2);
  cout << ans << '\n';
  for (int i = 1; i <= m; i++) cout << dup[i];
  cout << '\n';
  for (int i = 1; i <= m; i++)
    if (dup[i]) sy[i] = sy[i + m] = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (dup[j]) {
        int tmp = w[i][j];
        w[i][j] = tmp / 2;
        w[i][j + m] = tmp / 2;
        if (tmp & 1) {
          if (sy[j] < sy[j + m])
            ++w[i][j];
          else
            ++w[i][j + m];
        }
        sy[j] += w[i][j];
        sy[j + m] += w[i][j + m];
      }
  m <<= 1;
  for (int i = 1; i <= n; i++) {
    w[i][i + m] = ans - sx[i];
    sx[i] += w[i][i + m];
    sy[i + m] += w[i][i + m];
  }
  for (int i = 1; i <= m; i++) {
    w[i + n][i] = ans - sy[i];
    sx[i + n] += w[i + n][i];
    sy[i] += w[i + n][i];
  }
  for (int i = n + 1; i <= n + m; i++)
    for (int j = m + 1; j <= m + n; j++) {
      w[i][j] = ans - max(sx[i], sy[j]);
      sx[i] += w[i][j];
      sy[j] += w[i][j];
    }
  int now = 0;
  while (now < ans) {
    memset(mat_r, 0, sizeof(mat_r));
    for (int i = 1; i <= n + m; i++) {
      memset(vis, 0, sizeof(vis));
      assert(find(i));
    }
    for (int i = 1; i <= n + m; i++) mat_l[mat_r[i]] = i;
    int mn = 1e9;
    for (int i = 1; i <= n + m; i++) {
      mn = min(mn, w[i][mat_l[i]]);
    }
    for (int i = 1; i <= n + m; i++) {
      if (i <= n && mat_l[i] <= m) opt.push_back((dat){i, mat_l[i], now, mn});
      w[i][mat_l[i]] -= mn;
    }
    now += mn;
  }
  cout << int(opt.size()) << '\n';
  for (auto t : opt)
    cout << t.i << ' ' << (t.j - 1) % (m / 2) + 1 << ' ' << t.s << ' ' << t.d
         << '\n';
  return 0;
}