#include <bits/stdc++.h>
using namespace std;
bool suf(string &V, string &A) {
  if (A.size() > V.size()) return false;
  reverse(A.begin(), A.end());
  reverse(V.begin(), V.end());
  for (int i = 0; i < (int)A.size(); i++) {
    if (A[i] != V[i]) {
      reverse(A.begin(), A.end());
      reverse(V.begin(), V.end());
      return false;
    }
  }
  reverse(A.begin(), A.end());
  reverse(V.begin(), V.end());
  return true;
}
bool cmp(string A, string B) {
  if (A.size() > B.size()) return true;
  return false;
}
void delete_dup(vector<string> &V) {
  sort(V.begin(), V.end(), cmp);
  vector<bool> E(V.size(), true);
  for (int i = 1; i < (int)V.size(); i++) {
    for (int j = 0; j < i; j++) {
      if (suf(V[j], V[i])) {
        E[i] = false;
        break;
      }
    }
  }
  vector<string> R;
  for (int i = 0; i < (int)V.size(); i++) {
    if (E[i]) {
      R.push_back(V[i]);
    }
  }
  swap(V, R);
}
int main() {
  ios_base::sync_with_stdio(false);
  int n;
  cin >> n;
  map<string, vector<string>> M;
  while (n--) {
    string name;
    cin >> name;
    int ile;
    cin >> ile;
    M[name];
    for (int i = 0; i < ile; i++) {
      string num;
      cin >> num;
      M[name].push_back(num);
    }
  }
  for (map<string, vector<string>>::iterator i = M.begin(); i != M.end(); i++) {
    delete_dup(i->second);
  }
  cout << M.size() << endl;
  for (map<string, vector<string>>::iterator i = M.begin(); i != M.end(); i++) {
    cout << i->first << ' ' << (i->second).size() << ' ';
    for (int j = 0; j < (int)(i->second).size(); j++) {
      cout << (i->second)[j] << ' ';
    }
    cout << endl;
  }
  return 0;
}
