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;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using uint = unsigned int;
using vi = vector<int>;
using pii = pair<int, int>;
const int N = 3e5 + 5;
int cur = 0;
pii a[N];
vi v[N];
set<pii> edges;
void addEdge(int v, int u) {
  edges.insert(make_pair(v, u));
  edges.insert(make_pair(u, v));
}
void addEdges(const vi& cycle) {
  for (int i = 0; i < ((int)((cycle).size()) - 1); ++i) {
    addEdge(cycle[i], cycle[i + 1]);
  }
  addEdge(cycle[0], cycle.back());
}
void glue(vector<int>& cycle, int edgesNum, int k, int ind) {
  if ((int)((cycle).size()) + edgesNum - 2 * k <= 2) k--;
  int removed = -1;
  if (k == edgesNum - 1 &&
      edges.count(
          make_pair(cycle.back(), cycle[(int)((cycle).size()) - k - 1]))) {
    removed = cycle.back();
    cycle.pop_back();
  }
  int b = cycle.back();
  vi u;
  for (int i = 0; i < (k); ++i) {
    u.push_back(cycle.back());
    cycle.pop_back();
  }
  v[ind].push_back(cycle.back());
  for (int i = 0; i < (edgesNum - k - 1); ++i) {
    v[ind].push_back(cur);
    cycle.push_back(cur++);
  }
  cycle.push_back(b);
  v[ind].insert(v[ind].end(), (u).begin(), (u).end());
  if (removed != -1) cycle.push_back(removed);
  addEdges(v[ind]);
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  for (int i = 0; i < (n); ++i) cin >> a[i].first, a[i].second = i;
  sort(a, a + n);
  reverse(a, a + n);
  vi cycle;
  for (int i = 0; i < (a[0].first); ++i) cycle.push_back(cur++);
  v[a[0].second] = cycle;
  addEdges(cycle);
  int sum = 0;
  for (int i = (1); i < (n); ++i) sum += a[i].first - 2;
  for (int i = (1); i < (n); ++i) {
    int k = a[i].first - 2;
    sum -= k;
    if ((int)((cycle).size()) + k - 2 < sum) {
      glue(cycle, a[i].first, 1, a[i].second);
    } else if ((int)((cycle).size()) - k - 2 >= sum) {
      glue(cycle, a[i].first, a[i].first - 1, a[i].second);
    } else {
      glue(cycle, a[i].first,
           ((int)((cycle).size()) + a[i].first - 2 - sum) / 2, a[i].second);
    }
  }
  cout << cur << "\n";
  for (int i = 0; i < (n); ++i) {
    for (int k : v[i]) cout << k + 1 << " ";
    cout << "\n";
  }
  return 0;
}