#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const double pi = 3.1415926535897932384626;
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
const int maxn = 1e5 + 5;
int n, vis[maxn];
struct node {
  int x;
  char ch;
  string s;
  bool operator<(const node &a) const {
    if (x == a.x) return ch < a.ch;
    return x < a.x;
  }
} p[maxn];
vector<pair<int, int> > g1, g2;
int main() {
  n = read();
  for (int i = 1; i <= n; ++i) {
    cin >> p[i].s;
    int len = p[i].s.length();
    for (int j = 0; j < len; ++j) {
      if (p[i].s[j] == 'a' || p[i].s[j] == 'e' || p[i].s[j] == 'i' ||
          p[i].s[j] == 'o' || p[i].s[j] == 'u') {
        ++p[i].x;
        p[i].ch = p[i].s[j];
      }
    }
  }
  sort(p + 1, p + n + 1);
  for (int i = 1; i < n; ++i) {
    if (p[i].x == p[i + 1].x && p[i].ch == p[i + 1].ch) {
      vis[i] = vis[i + 1] = 1;
      g1.push_back(make_pair(i, i + 1));
      ++i;
    }
  }
  int pos = 0;
  p[0].x = 0;
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      if (p[pos].x == p[i].x) {
        vis[i] = 1;
        g2.push_back(make_pair(pos, i));
        pos = 0;
      } else
        pos = i;
    }
  }
  int k = min(g1.size(), g2.size());
  int m = k + (g1.size() - k) / 2;
  printf("%d\n", m);
  for (int i = 0; i < k; ++i) {
    cout << p[g2[i].first].s << ' ' << p[g1[i].first].s << '\n';
    cout << p[g2[i].second].s << ' ' << p[g1[i].second].s << '\n';
  }
  for (int i = k; i + 1 < g1.size(); i += 2) {
    cout << p[g1[i].first].s << ' ' << p[g1[i + 1].first].s << '\n';
    cout << p[g1[i].second].s << ' ' << p[g1[i + 1].second].s << '\n';
  }
  return 0;
}
