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;
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "{";
  for (const T& v : vc) o << v << ",";
  o << "}";
  return o;
}
using ll = long long;
template <class T>
using V = vector<T>;
template <class T>
using VV = vector<vector<T>>;
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  int N;
  cin >> N;
  V<int> f(N);
  for (int i = 0; i < (int)(N); i++) cin >> f[i];
  V<int> idx(N);
  for (int i = 0; i < (int)(N); i++) idx[i] = i;
  sort(idx.begin(), idx.end(), [&](int a, int b) { return f[a] > f[b]; });
  sort(f.begin(), f.end(), greater<int>());
  VV<int> ans(N);
  int S = f[0];
  V<int> d(N);
  for (int i = 1; i <= (int)(N - 1); i++) {
    d[i] = -(f[i] - 2);
    S += d[i];
  }
  for (int i = 1; i <= (int)(N - 1); i++) {
    if (S >= 3) break;
    while (d[i] + 2 <= f[i] - 2) {
      if (S >= 3) break;
      S += 2, d[i] += 2;
    }
  }
  true;
  true;
  true;
  using P = pair<int, int>;
  set<P> es;
  int X = f[0];
  V<int> c(X);
  for (int i = 0; i < (int)(X); i++) c[i] = i;
  auto ADD = [&](int i, V<int>& c) {
    ans[idx[i]] = c;
    int K = c.size();
    for (int i = 0; i < (int)(K); i++) {
      es.insert(P(c[i], c[(i + 1) % K]));
      es.insert(P(c[(i + 1) % K], c[i]));
    }
  };
  ADD(0, c);
  for (int i = 1; i <= (int)(N - 1); i++) {
    int n = c.size();
    int y = (f[i] + d[i]) / 2;
    int x = f[i] - y;
    true;
    true;
    true;
    true;
    if (y == 1 && es.count(P(c[n - 1], c[n - 1 - x]))) {
      rotate(c.begin(), c.begin() + 1, c.end());
    }
    if (y == 1 && es.count(P(c[n - 1], c[n - 1 - x]))) {
      assert(0);
    }
    V<int> ci, path;
    for (int j = 0; j < (int)(x + 1); j++) ci.push_back(c[n - 1 - j]);
    for (int j = 0; j < (int)(y - 1); j++) path.push_back(X++);
    ci.insert(ci.end(), path.begin(), path.end());
    ADD(i, ci);
    int LAST = c.back();
    for (int i = 0; i < (int)(x); i++) c.pop_back();
    c.insert(c.end(), path.begin(), path.end());
    c.push_back(LAST);
  }
  cout << X << endl;
  for (int i = 0; i < (int)(N); i++) {
    for (int v : ans[i]) cout << v + 1 << " ";
    cout << '\n';
  }
}