#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 50005, M = 555;
struct node
{
int y, id;
};
vector<node> nbr[N];
map<string, int> Mapst;
map<string, int> Maped;
int n, k, mth[N], cntst, cnted, ans, as, Tsn[N], tim, dfn[N], out[N];
string s[N];
bool vis[N], visn[N];
void dfs(int cur, bool flag, int ti)
{
vis[cur] = true;
for(int i = 0; i < nbr[cur].size(); i++)
{
int nxt = nbr[cur][i].y;
if(vis[nxt])
continue;
dfs(nxt, !flag, ti);
if(flag)
Tsn[++as] = nxt;
}
return ;
}
bool hungary(int cur, int ti)
{
for(auto E : nbr[cur])
{
int nxt = E.y;
if(dfn[nxt] == ti)
continue;
dfn[nxt] = ti;
if(!mth[nxt] || hungary(mth[nxt], ti))
{
mth[nxt] = cur;
return true;
}
}
return false;
}
signed main()
{
cin >> n >> k;
for(int i = 1; i <= n; i++)
{
cin >> s[i];
string st = s[i].substr(0, k);
if(!Mapst[st])
Mapst[st] = ++cntst;
}
cnted = cntst;
for(int i = 1; i <= n; i++)
{
string st = s[i].substr(0, k), ed = s[i].substr(s[i].size() - k);
if(!Maped[ed])
Maped[ed] = ++cnted;
nbr[Mapst[st]].push_back((node){Maped[ed], i});
nbr[Maped[ed]].push_back((node){Mapst[st], i});
}
for(int i = 1; i <= cntst; i++)
if(hungary(i, ++tim))
ans++;
for(int i = cntst + 1; i <= cnted; i++)
if(!mth[i] && !vis[i])
dfs(i, 1, ++tim);
for(int i = cntst + 1; i <= cnted; i++)
if(mth[i] && !vis[i])
Tsn[++as] = i;
cout << as << endl;
memset(vis, 0, sizeof vis);
for(int i = 1; i <= as; i++)
for(auto E : nbr[Tsn[i]])
{
if(vis[E.id])
out[i]++;
vis[E.id] = true;
}
for(int i = 1; i <= as; i++)
{
cout << nbr[Tsn[i]].size() - out[i] << ' ';
for(auto E : nbr[Tsn[i]])
{
if(!visn[E.id])
cout << E.id << ' ', visn[E.id] = 1;
}
cout << endl;
}
return 0;
}