#include <bits/stdc++.h>
using namespace std;
const long double PI = 3.141592653589793238462643383;
struct Rcompare {
  bool operator()(pair<long long int, long long int> lhs,
                  pair<long long int, long long int> rhs) {
    return lhs.first > rhs.first;
  }
};
struct compare {
  bool operator()(pair<long long int, long long int> lhs,
                  pair<long long int, long long int> rhs) {
    return lhs.first < rhs.first;
  }
};
long long int gcd(long long int a, long long int b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
long long int lcm(long long int a, long long int b) {
  return a * (b / gcd(a, b));
}
long long int Abs(long long int a) {
  if (a > 0) return a;
  return -a;
}
long long int Ceil(long long int a, long long int b) {
  if (a % b == 0)
    return a / b;
  else
    return a / b + 1;
}
double Abs(double a) {
  if (a > 0) return a;
  return -a;
}
long long int pow(long long int x, long long int y) {
  if (y == 0) return 1;
  long long int tmp = pow(x, y / 2);
  if (y % 2 == 1) return ((tmp * tmp) * x);
  return (tmp * tmp);
}
const int MAX = 400009;
const int MOD = 1e9 + 7;
bool compare(string &s1, string &s2) { return s1.size() < s2.size(); }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  map<string, int> mp;
  int k = 0;
  map<int, string> inv;
  vector<string> num[20];
  for (int i = 0; i < (n); ++i) {
    string s;
    cin >> s;
    if (mp.find(s) == mp.end()) mp[s] = k, inv[k] = s, k++;
    int t;
    cin >> t;
    int c = mp[s];
    for (int i = 0; i < (t); ++i) {
      string tmp;
      cin >> tmp;
      num[c].push_back(tmp);
    }
  }
  for (int i = 0; i < (k); ++i) sort((num[i]).begin(), (num[i]).end(), compare);
  cout << k << '\n';
  for (int i = 0; i < (k); ++i) {
    cout << inv[i] << ' ';
    for (int j = 0; j < ((int)((num[i]).size())); ++j) {
      string u = num[i][j];
      for (int jj = j + 1; jj <= ((int)((num[i]).size()) - 1); ++jj) {
        string v = num[i][jj];
        string tmp =
            v.substr((int)((v).size()) - (int)((u).size()), (int)((u).size()));
        if (tmp == u) {
          num[i].erase(num[i].begin() + j), j--;
          break;
        }
      }
    }
    cout << (int)((num[i]).size()) << ' ';
    for (int j = 0; j < ((int)((num[i]).size())); ++j) {
      cout << num[i][j] << ' ';
    }
    cout << '\n';
  }
  return 0;
}
