#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2,fma")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
int n, raod[1000005][5], last, cur;
string second[100005];
vector<pair<int, int> > same, nt;
map<char, int> he;
vector<int> k[1000005];
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  he['a'] = 1;
  he['e'] = 2;
  he['o'] = 3;
  he['i'] = 4;
  he['u'] = 5;
  for (int i = 1; i <= n; i++) {
    cin >> second[i];
    cur = 0;
    for (int j = 0; j < second[i].size(); j++) {
      if (second[i][j] == 'a' || second[i][j] == 'e' || second[i][j] == 'o' ||
          second[i][j] == 'i' || second[i][j] == 'u') {
        cur++;
        last = he[second[i][j]];
      }
    }
    if (raod[cur][last] == 0) {
      raod[cur][last] = i;
    } else {
      same.push_back({i, raod[cur][last]});
      raod[cur][last] = 0;
    }
  }
  for (int i = 1; i <= 1000000; i++) {
    for (int j = 1; j <= 5; j++) {
      if (raod[i][j]) k[i].push_back(raod[i][j]);
    }
  }
  for (int i = 1; i <= 1000000; i++) {
    for (int j = 0; j < k[i].size(); j++) {
      if (j % 2) nt.push_back({k[i][j], k[i][j - 1]});
    }
  }
  while ((int)same.size() > (int)nt.size()) {
    nt.push_back(same[(int)same.size() - 1]);
    same.pop_back();
  }
  cout << min((int)same.size(), (int)nt.size()) << endl;
  for (int i = 0; i < min((int)same.size(), (int)nt.size()); i++) {
    cout << second[nt[i].first] << " " << second[same[i].first] << endl;
    cout << second[nt[i].second] << " " << second[same[i].second] << endl;
  }
  return 0;
}
