#include <bits/stdc++.h>
using namespace std;
void solve() {
  long long int n, i;
  cin >> n;
  map<string, long long int> m;
  vector<vector<string> > vec;
  vector<string> name;
  for (i = 1; i <= n; i++) {
    string s = "";
    int p;
    cin >> s >> p;
    auto it = m.find(s);
    long long int f = -1;
    if (it != m.end()) {
      f = it->second;
    }
    long long int j;
    vector<string> str;
    for (j = 1; j <= p; j++) {
      string ph = "";
      cin >> ph;
      if (f != -1) {
        vec[f].push_back(ph);
      } else {
        str.push_back(ph);
      }
    }
    if (f == -1) {
      vec.push_back(str);
      m[s] = vec.size() - 1;
      name.push_back(s);
    }
  }
  for (i = 0; i < vec.size(); i++) {
    if (vec[i].size() == 1) continue;
    long long int j = 0;
    long long int k;
    long long int nn = vec[i].size();
    for (j = 0; j < (vec[i].size()); j++) {
      string sr = vec[i][j];
      for (k = 0; k < vec[i].size(); k++) {
        if (j == k) continue;
        string tr = vec[i][k];
        if (sr.size() > tr.size()) continue;
        long long int x = sr.size() - 1;
        long long int y = tr.size() - 1;
        int ff = 1;
        while (x >= 0 && y >= 0) {
          if (sr[x] != tr[y]) {
            ff = 0;
            break;
          }
          x--;
          y--;
        }
        if (ff) {
          vec[i].erase(vec[i].begin() + j);
          j--;
          break;
        }
      }
    }
  }
  cout << vec.size() << "\n";
  for (i = 0; i < vec.size(); i++) {
    cout << name[i] << " " << vec[i].size() << " ";
    long long int j;
    for (j = 0; j < vec[i].size(); j++) {
      cout << vec[i][j] << " ";
    }
    cout << "\n";
  }
}
int main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(NULL);
  int t;
  t = 1;
  while (t > 0) {
    t--;
    solve();
  }
}
