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;
const int MAXN = 300005;
int n, siz, cnt;
int a[MAXN], suf[MAXN], lef[MAXN], rig[MAXN];
pair<int, int> p[MAXN];
set<pair<int, int> > st;
vector<int> v[MAXN];
void init_cyc(int x) {
  siz = x;
  cnt = x;
  st.insert({1, x});
  for (int i = 1; i <= x; i++) {
    if (i != x) st.insert({i, i + 1});
    v[p[0].second].push_back(i);
    if (i == 1)
      lef[i] = x;
    else
      lef[i] = i - 1;
    if (i == x)
      rig[i] = 1;
    else
      rig[i] = i + 1;
  }
}
void spoji(int a, int b) {
  rig[a] = b;
  lef[b] = a;
  st.insert({min(a, b), max(a, b)});
}
void add(int ind, int len, int k) {
  int lo = 1, hi = 1;
  for (int i = 0; i < k; i++) hi = rig[hi];
  if (k == len - 1 && st.find({min(lo, hi), max(lo, hi)}) != st.end())
    lo = rig[lo], hi = rig[hi];
  int curr = hi;
  while (curr != lo) {
    v[ind].push_back(curr);
    curr = lef[curr];
  }
  for (auto x : v[ind]) {
    if (x == hi) continue;
    rig[lef[x]] = rig[x];
    lef[rig[x]] = lef[x];
    siz--;
  }
  int novi = lo;
  for (int i = 1; i < len - k; i++) {
    v[ind].push_back(novi);
    cnt++;
    siz++;
    spoji(novi, cnt);
    novi = cnt;
  }
  v[ind].push_back(novi);
  spoji(novi, hi);
}
void rjesi() {
  for (int i = 1; i < n; i++) {
    int ind = p[i].second;
    if (siz - suf[i] <= 2) {
      int val = siz + a[i] - 2 - suf[i + 1];
      if (val <= 2) {
        add(ind, a[i], 1);
      } else {
        int k = (val - 3) / 2 + 1;
        add(ind, a[i], k);
      }
    } else {
      add(ind, a[i], a[i] - 1);
    }
  }
}
void ispis() {
  cout << cnt << endl;
  for (int i = 0; i < n; i++) {
    for (auto x : v[i]) cout << x << " ";
    cout << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    p[i] = {a[i], i};
  }
  sort(p, p + n);
  reverse(p, p + n);
  for (int i = n - 1; i >= 0; i--) {
    a[i] = p[i].first;
    suf[i] = suf[i + 1] + a[i] - 2;
  }
  init_cyc(a[0]);
  rjesi();
  ispis();
  return 0;
}