#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
template <class T>
T gcd(T a, T b) {
  return a ? gcd(b % a, a) : b;
}
template <class T>
T sqr(T a) {
  return a * a;
}
template <class T>
T sgn(T a) {
  return a > 0 ? 1 : (a < 0 ? -1 : 0);
}
const int N = 2e5 + 10;
const int inf = 1e9 + 10;
const int mod = 1e9 + 7;
int n;
int m;
map<string, int> w;
vector<string> a[100];
bool ff(string aa, string b) {
  if (((int)(aa).size()) < ((int)(b).size())) return true;
  if (((int)(aa).size()) == ((int)(b).size())) return aa < b;
  return false;
}
bool ook(string aa, string bb) {
  bool ok = true;
  for (int i = ((int)(aa).size()) - 1; i >= 0; i--)
    if (aa[i] != bb[((int)(bb).size()) - (((int)(aa).size()) - i)]) ok = false;
  return ok;
}
int main() {
  cin >> n;
  int k = 0;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    if (w.count(s) == 0) w[s] = k, k++;
    int x;
    cin >> x;
    for (int j = 0; j < x; j++) {
      string ss;
      cin >> ss;
      a[w[s]].push_back(ss);
    }
  }
  for (int i = 0; i < k; i++) {
    sort((a[i]).begin(), (a[i]).end(), ff);
    a[i].resize(unique((a[i]).begin(), (a[i]).end()) - (a[i]).begin());
    bool ok = true;
    for (int j = 0; j < ((int)(a[i]).size()) && ok; j++)
      for (int z = j + 1; z < ((int)(a[i]).size()); z++)
        if (ook(a[i][j], a[i][z])) {
          a[i][j] = "a";
          break;
        }
  }
  cout << ((int)(w).size()) << endl;
  for (auto x : w) {
    cout << x.first << " ";
    int r = x.second;
    int cnt = 0;
    for (int i = 0; i < ((int)(a[r]).size()); i++)
      if (a[r][i] != "a") cnt++;
    cout << cnt << " ";
    for (int i = 0; i < ((int)(a[r]).size()); i++)
      if (a[r][i] != "a") cout << a[r][i] << " ";
    cout << endl;
  }
  return 0;
}
