#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;
int n, m, k, t;
struct Word {
  string word;
  int num;
  char last;
  bool operator<(const Word& that) const {
    if (this->num != that.num) return this->num < that.num;
    return this->last < that.last;
  }
} words[MAXN];
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> words[i].word;
    for (auto c : words[i].word) {
      if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
        words[i].num++;
        words[i].last = c;
      }
    }
  }
  sort(words + 1, words + 1 + n);
  vector<pair<int, int> > fi, se;
  int pos = 1;
  int w = -1, cnt = 1;
  while (pos <= n) {
    if (words[pos].num == cnt) {
      if (words[pos].num == words[pos + 1].num &&
          words[pos].last == words[pos + 1].last) {
        se.emplace_back(make_pair(pos, pos + 1));
        pos += 2;
      } else {
        if (w != -1) {
          fi.emplace_back(make_pair(w, pos));
          w = -1;
        } else
          w = pos;
        pos += 1;
      }
    } else {
      cnt = words[pos].num;
      w = -1;
    }
  }
  int s1 = fi.size(), s2 = se.size();
  int res = 0;
  res += min(s1, s2) + max(0, (s2 - s1) / 2);
  cout << res << endl;
  int i;
  for (i = 0; i < min(fi.size(), se.size()); i++) {
    cout << words[fi[i].first].word << ' ' << words[se[i].first].word << endl;
    cout << words[fi[i].second].word << ' ' << words[se[i].second].word << endl;
  }
  for (; i + 1 < se.size(); i += 2) {
    cout << words[se[i].first].word << ' ' << words[se[i + 1].first].word
         << endl;
    cout << words[se[i].second].word << ' ' << words[se[i + 1].second].word
         << endl;
  }
  return 0;
}
