#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1000011;
struct node {
  node() {}
  vector<string> words[26];
};
char s[maxn];
void check(int &num, char &c) {
  int len = strlen(s);
  num = 0;
  for (int i = 0; i < len; ++i) {
    if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' ||
        s[i] == 'u') {
      ++num;
      c = s[i];
    }
  }
}
vector<pair<string, string>> v1, v2;
int main() {
  int n;
  scanf("%d", &n);
  map<int, node> mp;
  for (int i = 0; i < n; ++i) {
    scanf("%s", s);
    int num;
    char ch;
    check(num, ch);
    if (mp.count(num) == 0) {
      mp[num] = node();
    }
    mp[num].words[ch - 'a'].push_back(string(s));
  }
  for (auto &val : mp) {
    assert(val.first > 0);
    auto &vval = val.second;
    vector<string> tmp;
    for (int i = 0; i < 26; ++i) {
      int len = vval.words[i].size();
      for (int j = 1; j < len; j += 2) {
        v1.push_back({vval.words[i][j - 1], vval.words[i][j]});
      }
      if (len % 2) {
        tmp.push_back(vval.words[i].back());
      }
    }
    int len = tmp.size();
    for (int j = 1; j < len; j += 2) {
      v2.push_back({tmp[j - 1], tmp[j]});
    }
  }
  if (v1.size() <= v2.size()) {
    int ans = v1.size();
    printf("%d\n", ans);
    for (int i = 0; i < ans; ++i) {
      printf("%s %s\n%s %s\n", v2[i].first.c_str(), v1[i].first.c_str(),
             v2[i].second.c_str(), v1[i].second.c_str());
    }
  } else {
    int ans = v2.size() + (v1.size() - v2.size()) / 2;
    printf("%d\n", ans);
    for (int i = 0; i < v2.size(); ++i) {
      printf("%s %s\n%s %s\n", v2[i].first.c_str(), v1[i].first.c_str(),
             v2[i].second.c_str(), v1[i].second.c_str());
    }
    for (int i = v2.size() + 1; i < v1.size(); i += 2) {
      printf("%s %s\n%s %s\n", v1[i].first.c_str(), v1[i - 1].first.c_str(),
             v1[i].second.c_str(), v1[i - 1].second.c_str());
    }
  }
  return 0;
}
