#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int maxm = 1e6 + 10;
string s[maxn];
struct word {
  int id, lst;
  word() {}
  word(int id, int lst) : id(id), lst(lst) {}
  bool operator<(const word &t) const {
    if (lst != t.lst) return lst < t.lst;
    return id < t.id;
  }
};
vector<word> len[maxm];
int cot[maxn], lst[maxn];
int n, mx;
set<word> dq;
set<word>::iterator it, itb;
int ff, fs, sf, ss;
vector<int> ans[4];
inline bool good(char x) {
  return x == 'a' || x == 'e' || x == 'u' || x == 'i' || x == 'o';
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  mx = 0;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
    for (int j = 0; j < s[i].length(); j++) {
      if (good(s[i][j])) {
        cot[i]++;
        lst[i] = s[i][j] - 'a';
      }
    }
    len[cot[i]].push_back(word(i, lst[i]));
    mx = max(mx, cot[i]);
  }
  ff = fs = sf = ss = -1;
  word fst;
  for (int i = 1; i <= mx; i++) {
    if (!len[i].empty()) {
      sort(len[i].begin(), len[i].end());
      for (int j = 0; j < len[i].size(); j++) {
        if (j + 1 < len[i].size() && len[i][j].lst == len[i][j + 1].lst) {
          j++;
          continue;
        } else
          dq.insert(word(len[i][j].id, i));
      }
    }
  }
  for (int i = 1; i <= mx; i++) {
    if (!len[i].empty()) {
      for (int j = 0; j < len[i].size(); j++) {
        if (j + 1 < len[i].size() && len[i][j].lst == len[i][j + 1].lst) {
          bool got = 0;
          if (!dq.empty()) {
            for (it = dq.begin(); it != dq.end(); it++) {
              itb = ++it;
              --it;
              if (itb != dq.end() && (*it).lst == (*itb).lst) {
                got = 1;
                ans[0].emplace_back((*it).id);
                ans[1].emplace_back(len[i][j].id);
                ans[2].emplace_back((*itb).id);
                ans[3].emplace_back(len[i][j + 1].id);
                dq.erase(it);
                dq.erase(itb);
                break;
              }
            }
          }
          if (!got) {
            dq.insert(word(len[i][j].id, i));
            dq.insert(word(len[i][j + 1].id, i));
          }
          j++;
          continue;
        } else
          ;
      }
    }
  }
  printf("%d\n", ans[0].size());
  for (int i = 0; i < ans[0].size(); i++) {
    printf("%s %s\n%s %s\n", s[ans[0][i]].c_str(), s[ans[1][i]].c_str(),
           s[ans[2][i]].c_str(), s[ans[3][i]].c_str());
  }
  return 0;
}
