#include <bits/stdc++.h>
using namespace std;
void __print(long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }
template <typename T, typename V>
void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T>
void __print(const T &x) {
  long long f = 0;
  cerr << '{';
  for (auto &i : x) cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v)) cerr << ", ";
  _print(v...);
}
const long long gf = 1e6 + 9;
bool vis[gf];
vector<long long> vec[gf];
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(0);
  long long n;
  cin >> n;
  string s[n + 1];
  map<char, long long> m1;
  char arr[5] = {'a', 'e', 'i', 'o', 'u'};
  for (long long i = 0; i < 5; i++) {
    m1[arr[i]]++;
  }
  map<pair<char, long long>, long long> m2;
  vector<pair<long long, long long> > v1;
  for (long long i = 1; i <= n; i++) {
    cin >> s[i];
    long long cnt = 0;
    char x;
    long long f = 0;
    for (long long j = (long long)s[i].size() - 1; j >= 0; j--) {
      if (m1[s[i][j]] && f == 0) {
        f = 1;
        x = s[i][j];
      }
      if (m1[s[i][j]]) {
        cnt++;
      }
    }
    if (m2[{x, cnt}] == 0) {
      m2[{x, cnt}] = i;
    } else {
      long long var1 = m2[{x, cnt}];
      long long var2 = i;
      v1.push_back({var1, var2});
      vis[var1] = 1;
      vis[var2] = 1;
      m2[{x, cnt}] = 0;
    }
  }
  vector<long long> v2;
  set<long long> s2;
  for (long long i = 1; i <= n; i++) {
    if (!vis[i]) {
      ;
      long long cnt = 0;
      for (long long j = 0; j < (long long)s[i].size(); j++) {
        if (m1[s[i][j]]) {
          cnt++;
        }
      }
      v2.push_back(cnt);
      s2.insert(cnt);
      vec[cnt].push_back(i);
    }
  }
  long long j = 0;
  vector<pair<long long, long long> > ans1, ans2;
  for (long long cnt : s2) {
    ;
    if (j >= (long long)v1.size()) break;
    if ((long long)vec[cnt].size() < 2) {
      continue;
    };
    for (long long k = 1; k < (long long)vec[cnt].size(); k++) {
      if (k % 2) {
        long long var1 = vec[cnt][k];
        long long var2 = vec[cnt][k - 1];
        if (j >= (long long)v1.size()) break;
        ans1.push_back({var1, v1[j].first});
        ans2.push_back({var2, v1[j].second});
        j++;
      }
    }
    if (j >= (long long)v1.size()) break;
  }
  j++;
  ;
  ;
  ;
  for (long long i = j; i < (long long)v1.size(); i++) {
    ans1.push_back({v1[i - 1].first, v1[i].first});
    ans2.push_back({v1[i - 1].second, v1[i].second});
    i++;
  }
  cout << (long long)ans1.size() << '\n';
  for (long long i = 0; i < (long long)ans1.size(); i++) {
    cout << s[ans1[i].first] << " " << s[ans1[i].second] << '\n';
    cout << s[ans2[i].first] << " " << s[ans2[i].second] << '\n';
  }
  return 0;
}
