#include <bits/stdc++.h>
using namespace std;
const int M = 200005;
const int N = 900005;
struct node {
  int son[27];
  int fa;
} a[N];
int sz;
char s[N];
int mat[M];
vector<int> over[N];
inline int new_id() {
  ++sz;
  over[sz].clear();
  for (int i = (1); i <= (26); i++) a[sz].son[i] = -1;
  return sz;
}
int np, ans;
void ins(int pos, int x, int y) {
  over[pos].push_back(np);
  if (x == y) return;
  int cur = s[x] - 'a' + 1;
  if (a[pos].son[cur] == -1) {
    a[pos].son[cur] = new_id();
    a[a[pos].son[cur]].fa = pos;
  }
  ins(a[pos].son[cur], ++x, y);
  return;
}
int u[M], n;
void dfs(int x, int dep) {
  for (int i = (1); i <= (26); i++)
    if (a[x].son[i] != -1) dfs(a[x].son[i], dep + 1);
  vector<int> g1, g2;
  g1.clear();
  g2.clear();
  for (int i = 0; i < over[x].size(); i++) {
    int j = over[x][i];
    if (u[j]) continue;
    if (j <= n)
      g1.push_back(j);
    else
      g2.push_back(j);
  }
  for (int i = 0; i < min(g1.size(), g2.size()); i++) {
    ans += dep;
    u[g1[i]] = u[g2[i]] = 1;
    mat[g1[i]] = g2[i] - n;
  }
}
int main() {
  scanf("%d", &n);
  sz = -1;
  new_id();
  for (int i = (1); i <= (n * 2); i++) {
    np = i;
    scanf("%s", &s);
    int len = strlen(s);
    ins(0, 0, len);
  }
  dfs(0, 0);
  printf("%d\n", ans);
  for (int i = (1); i <= (n); i++) printf("%d %d\n", i, mat[i]);
  return 0;
}
