#include <bits/stdc++.h>
using namespace std;
template <class T, class U>
inline istream& operator>>(istream& str, pair<T, U>& p) {
  return str >> p.first >> p.second;
}
template <class T>
inline istream& operator>>(istream& str, vector<T>& a) {
  for (auto& i : a) str >> i;
  return str;
}
const long long N = 1e6 + 10, mod = 1e9 + 7;
vector<long long> v[N][5];
vector<long long> vv[N];
long long mark[N];
map<char, long long> mm;
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n;
  cin >> n;
  mm['a'] = 0, mm['e'] = 1, mm['i'] = 2, mm['o'] = 3, mm['u'] = 4;
  vector<string> x;
  for (long long i = 0; i < n; i++) {
    string s;
    cin >> s;
    x.push_back(s);
    char last;
    long long count = 0;
    for (char c : s) {
      if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
        count++;
        last = c;
      }
    }
    vv[count].push_back(i);
    v[count][mm[last]].push_back(i);
  }
  vector<pair<long long, long long> > snd;
  vector<pair<long long, long long> > fst;
  for (long long i = 0; i < N; i++) {
    for (long long j = 0; j < 5; j++) {
      for (long long k = 1; k < (long long)v[i][j].size(); k += 2) {
        snd.push_back({v[i][j][k], v[i][j][k - 1]});
        mark[v[i][j][k]] = 1, mark[v[i][j][k - 1]] = 1;
      }
    }
  }
  for (long long i = 1; i < N; i++) {
    long long f = 0;
    long long pos;
    for (long long j = 0; j < (long long)vv[i].size(); j++) {
      if (!mark[vv[i][j]] && !f) {
        pos = vv[i][j];
        f = 1;
      } else if (!mark[vv[i][j]] && f) {
        fst.push_back({pos, vv[i][j]});
        f = 0;
      }
    }
  }
  long long xtra = (((long long)snd.size() - (long long)fst.size())) / 2;
  if ((long long)snd.size() <= (long long)fst.size()) xtra = 0;
  cout << min((long long)fst.size(), (long long)snd.size()) + xtra << '\n';
  long long i = 0;
  while (i < (long long)fst.size() && i < (long long)snd.size()) {
    cout << x[fst[i].first] << " " << x[snd[i].first] << '\n';
    cout << x[fst[i].second] << " " << x[snd[i].second] << '\n';
    i++;
  }
  if ((long long)snd.size() - (long long)fst.size() >= 2) {
    while (i < (long long)snd.size() - 1) {
      cout << x[snd[i].first] << " " << x[snd[i + 1].first] << '\n';
      cout << x[snd[i].second] << " " << x[snd[i + 1].second] << '\n';
      i += 2;
    }
  }
}
