Problem: Ujan has finally cleaned up his house and now wants to decorate the interior. He decided to place a beautiful carpet that would really tie the guest room together.

He is interested in carpets that are made up of polygonal patches such that each side of a patch is either a side of another (different) patch, or is an exterior side of the whole carpet. In other words, the carpet can be represented as a planar graph, where each patch corresponds to a face of the graph, each face is a simple polygon. The perimeter of the carpet is the number of the exterior sides. 

Ujan considers a carpet beautiful if it consists of f patches, where the i-th patch has exactly a_i sides, and the perimeter is the smallest possible. Find an example of such a carpet, so that Ujan can order it!

Input

The first line of input contains a single integer f (1 ≤ f ≤ 10^5), the number of patches in the carpet. 

The next line contains f integers a_1, …, a_f (3 ≤ a_i ≤ 3⋅ 10^5), the number of sides of the patches. The total number of the sides of the patches a_1 + … + a_f does not exceed 3⋅10^5.

Output

Output the description of the carpet as a graph. 

First, output a single integer n (3 ≤ n ≤ 3 ⋅ 10^5), the total number of vertices in your graph (the vertices must be numbered from 1 to n). 

Then output f lines containing the description of the faces. The i-th line should describe the i-th face and contain a_i distinct integers v_{i,1}, …, v_{i,a_i} (1 ≤ v_{i,j} ≤ n), which means that the vertices v_{i,j} and v_{i,(j mod{a_i})+1} are connected by an edge for any 1 ≤ j ≤ a_i.

The graph should be planar and satisfy the restrictions described in the problem statement. Its perimeter should be the smallest possible. There should be no double edges or self-loops in the graph. The graph should be connected. Note that a solution always exists; if there are multiple solutions, output any of them.

Examples

Input


2
3 3


Output


4
2 1 4 
1 2 3 


Input


3
5 3 5


Output


6
1 2 3 4 5
4 5 6
1 3 4 6 5

Note

In the first sample, the two triangular faces are connected by a single edge, which results in the minimum perimeter 4.

The figure shows one possible configuration for the second sample. The minimum perimeter in this case is 3. 

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n;
  cin >> n;
  vector<pair<int, int> > _a(n);
  for (int i = 0; i < n; i++) {
    cin >> _a[i].first;
    _a[i].second = i;
  }
  sort(_a.begin(), _a.end());
  reverse(_a.begin(), _a.end());
  vector<int> a(n);
  for (int i = 0; i < n; i++) a[i] = _a[i].first;
  vector<vector<int> > ans_ids(n);
  vector<int> cur_ids;
  int next_id = 0;
  for (int x = 0; x < a.front(); x++) {
    cur_ids.push_back(next_id);
    next_id++;
  }
  ans_ids[_a[0].second] = cur_ids;
  set<pair<int, int> > used;
  for (size_t i = 0; i < cur_ids.size(); i++) {
    used.insert({cur_ids[i], cur_ids[(i + 1) % (cur_ids.size())]});
  }
  for (int j = 1; j < (int)a.size(); j++) {
    int lb = 3;
    if (j + 1 < (int)a.size()) lb = a[j + 1];
    int x = (int)cur_ids.size();
    int y = a[j];
    int k = 0;
    while (x + y - 2 >= lb && x >= 2 && y >= 2) {
      x--;
      y--;
      k++;
    }
    assert(k >= 1);
    if (y == 1) {
      while (true) {
        int r = cur_ids.front();
        int s = cur_ids[cur_ids.size() - (a[j] - 1)];
        if (used.count({r, s}) || used.count({s, r})) {
          cur_ids.push_back(cur_ids.front());
          cur_ids.erase(cur_ids.begin());
        } else {
          break;
        }
      }
    }
    vector<int> new_poly;
    new_poly.push_back(cur_ids.front());
    cur_ids.push_back(-2);
    for (int i = 0; i < k; i++) {
      cur_ids.pop_back();
      new_poly.push_back(cur_ids.back());
    }
    for (int i = 0; i < y - 1; i++) {
      new_poly.push_back(next_id);
      cur_ids.push_back(next_id);
      next_id++;
    }
    for (size_t i = 0; i < new_poly.size(); i++) {
      used.insert({new_poly[i], new_poly[(i + 1) % new_poly.size()]});
    }
    ans_ids[_a[j].second] = new_poly;
  }
  cout << next_id << '\n';
  for (vector<int> x : ans_ids) {
    for (int y : x) {
      cout << y + 1 << ' ';
    }
    cout << '\n';
  }
}