#include <stdlib.h>
#include <string.h>
// maksymalna dlugosc jest liczona w czasie O(nklogn),
// pdciagi sa odtwarzane w czasie O(nk(k+logn)).
#include<vector>
#include<cstdio>
#include<algorithm>
#include<cassert>
using namespace std;
const int MAX_N=1000001;
const int MAX_K=20;
int n,k,t[MAX_N],where[MAX_N];
vector<int> s[MAX_K],res[MAX_K];
int final_val[MAX_N],final_level[MAX_N],from[MAX_K][MAX_K],to[MAX_K][MAX_K];
bool taken[MAX_N];
int main(){
scanf("%d %d",&n,&k);
assert(1<=n&&n<=MAX_N);
assert(1<=k&&k<=MAX_K);
for(int i=1;i<=n;i++){
taken[i]=false;
}
for(int i=0;i<n;i++){
scanf("%d",&t[i]);
assert(1<=t[i]&&t[i]<=n);
assert(!taken[t[i]]);
taken[t[i]]=true;
where[t[i]]=i;
}
for(int i=0;i<n;i++){
int j=0,val=t[i];
while(j<k){
vector<int>::iterator it=lower_bound(s[j].begin(),s[j].end(),val);
if(it==s[j].end()){
final_level[i]=j;
final_val[i]=val;
s[j].push_back(val);
break;
}
swap(*it,val);
++j;
}
if(j==k){
final_level[i]=k;
final_val[i]=val;
}
}
int ans=0;
for(int i=0;i<k;i++){
ans+=s[i].size();
}
printf("%d\n",ans);
for(int i=0;i<k;i++){
for(int j=0;j<i;j++){
from[i][j]=0;
to[i][j]=0;
}
from[i][i]=0;
to[i][i]=s[i].size();
for(int j=i+1;j<k;j++){
from[i][j]=s[i].size();
to[i][j]=s[i].size();
}
}
for(int i=n-1;i>=0;i--){
int j=final_level[i],val=final_val[i],subsequence;
if(j<k){
subsequence=0;
while(subsequence<k&&(to[j][subsequence]<s[j].size()||from[j][subsequence]>=s[j].size())){
++subsequence;
}
s[j].pop_back();
for(int z=0;z<k;z++){
from[j][z]=min(from[j][z],(int)s[j].size());
to[j][z]=min(to[j][z],(int)s[j].size());
}
}else{
subsequence=k;
}
while(j>0){
--j;
int pos=lower_bound(s[j].begin(),s[j].end(),val)-s[j].begin()-1;
int val2=s[j][pos],subsequence2=0;
while(subsequence2<k&&(to[j][subsequence2]<=pos||from[j][subsequence2]>pos)){
++subsequence2;
}
if(subsequence<k&&subsequence2==k){
if(from[j][subsequence]==to[j][subsequence]){
from[j][subsequence]=pos;
to[j][subsequence]=pos+1;
}else{
assert(from[j][subsequence]>pos);
for(int z=0;z<k;z++)if(from[j][z]>pos&&to[j][z]<=from[j][subsequence]){
from[j][z]=pos;
to[j][z]=pos;
}
from[j][subsequence]=pos;
}
subsequence=k;
}else if(subsequence==k&&subsequence2<k){
if(to[j][subsequence2]>pos+1){
subsequence=k;
}else{
--to[j][subsequence2];
subsequence=subsequence2;
}
}else if(subsequence<k&&subsequence2<k){
if(from[j][subsequence]<to[j][subsequence]){
assert(from[j][subsequence]>=to[j][subsequence2]);
for(int z=0;z<k;z++)if(from[j][z]>=to[j][subsequence2]&&to[j][z]<=from[j][subsequence]){
from[j][z]=pos;
to[j][z]=pos;
}
from[j][subsequence]=pos;
to[j][subsequence2]=pos;
subsequence=subsequence2;
}else{
if(to[j][subsequence2]>pos+1){
from[j][subsequence]=pos;
to[j][subsequence]=to[j][subsequence2];
for(int z=j-1;z>=0;z--){
swap(from[z][subsequence],from[z][subsequence2]);
swap(to[z][subsequence],to[z][subsequence2]);
}
swap(res[subsequence],res[subsequence2]);
to[j][subsequence2]=pos;
subsequence=subsequence2;
}else{
from[j][subsequence]=pos;
to[j][subsequence]=pos+1;
--to[j][subsequence2];
subsequence=subsequence2;
}
}
}
s[j][pos]=val;
val=val2;
}
assert(val==t[i]);
if(subsequence<k){
if(!res[subsequence].empty())assert(val<res[subsequence].back());
res[subsequence].push_back(val);
}
}
for(int j=0;j<k;j++){
reverse(res[j].begin(),res[j].end());
printf("%d",(int)res[j].size());
for(int i=0;i<res[j].size();i++){
printf(" %d",res[j][i]);
if(i){
assert(res[j][i-1]<res[j][i]);
assert(where[res[j][i-1]]<where[res[j][i]]);
}
--ans;
}
printf("\n");
res[j].clear();
}
assert(!ans);
return 0;
}