#include <bits/stdc++.h>
#define int int64_t
//#pragma GCC optimize("Ofast")
#define f first
#define s second
#define opt1 ios_base::sync_with_stdio(false)
#define opt2 cin.tie(NULL)
#define optimize opt1; opt2
#define pb push_back
#define endl "\n"
#define sz(v) (int)v.size()
using namespace std;
typedef pair<int, int> ii;
typedef pair<int, ii> i3;
typedef pair<ii, ii> i4;
typedef pair<int, i4> i5;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<i3> vi3;
typedef vector<i4> vi4;
const int inf = 0x6f6f6f6f;
const int MAX = 2000005;
const int LOG = 21;
const int mod = 998244353;
int BB (int low, int high, int val) {
int mid, best = -1;
while (low <= high) {
mid = (low+high)/2;
}
return best;
}
ii a[MAX];
int32_t main () {
optimize;
//freopen("angry.in", "r", stdin);
//freopen("angry.out", "w", stdout);
int n, d, m;
cin >> n >> d >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i].f;
a[i].s = i;
}
sort(a+1, a+m+1);
int low = 0, high = inf, mid, best = -1;
while (low <= high) {
mid = (low+high)/2;
int ava = mid, wait = 0, t = 0, res = 0;
for (int i = 1; i <= m; i++) {
if (a[i].f > t) {
ava += wait;
t = a[i].f;
wait = 0;
}
if (ava > 0) {
ava--;
wait++;
res = max(res, t-a[i].f);
} else {
ava += wait;
t++;
wait = 0;
ava--;
wait++;
res = max(res, t-a[i].f);
}
}
if (res <= d) {
best = mid;
high = mid-1;
} else low = mid+1;
}
cout << best << endl;
int ava = best, wait = 0, t = 0;
vector <vi> Ans;
Ans.resize(n+1);
for (int i = 1; i <= m; i++) {
if (a[i].f > t) {
ava += wait;
t = a[i].f;
wait = 0;
}
if (ava > 0) {
ava--;
wait++;
Ans[t].pb(a[i].s);
} else {
ava += wait;
t++;
wait = 0;
ava--;
wait++;
Ans[t].pb(a[i].s);
}
}
for (int i = 1; i <= n; i++) {
for (auto v : Ans[i])
cout << v << " ";
cout << "0\n";
}
return 0;
}