#include <bits/stdc++.h>
using namespace std;
list<int> l1[800010];
list<int> l2[800010];
char a[800010], b[800010];
int w, s, sw, lev[800010], n, num[800010], t, par[800010], tree[800010][27],
    len, cnt, red[800010], blue[800010];
long long dap;
struct data {
  int x, y;
} ans[100010];
void trie(int x, int p) {
  lev[x] = p - 1;
  if (p == len + 1) {
    num[t] = x;
    if (sw == 1) {
      red[x]++;
      l1[x].push_back(t);
    } else {
      blue[x]++;
      l2[x].push_back(t);
    }
    return;
  }
  if (tree[x][a[p] - 96])
    trie(tree[x][a[p] - 96], p + 1);
  else {
    tree[x][a[p] - 96] = ++cnt;
    par[cnt] = x;
    trie(tree[x][a[p] - 96], p + 1);
  }
}
void dfs(int x) {
  int i;
  for (i = 1; i <= 26; i++) {
    if (tree[x][i]) dfs(tree[x][i]);
    if (tree[x][i] == 0) continue;
    red[x] += red[tree[x][i]];
    blue[x] += blue[tree[x][i]];
    l1[x].splice(l1[x].begin(), l1[tree[x][i]]);
    l2[x].splice(l2[x].begin(), l2[tree[x][i]]);
  }
  s = min(red[x], blue[x]);
  dap += (long long)lev[x] * (long long)s;
  for (i = 1; i <= s; i++) {
    w++;
    ans[w].x = l1[x].back();
    ans[w].y = l2[x].back();
    l1[x].pop_back();
    l2[x].pop_back();
  }
  red[x] -= s;
  blue[x] -= s;
}
int main() {
  int i;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%s", a + 1);
    len = strlen(a + 1);
    sw = 1;
    t = i;
    trie(0, 1);
  }
  for (i = 1; i <= n; i++) {
    scanf("%s", a + 1);
    len = strlen(a + 1);
    sw = 2;
    t = i;
    trie(0, 1);
  }
  dfs(0);
  printf("%lld\n", dap);
  for (i = 1; i <= n; i++) printf("%d %d\n", ans[i].x, ans[i].y);
  return 0;
}
