#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, maxs = 28, maxl = 8e5 + 100;
int n;
char s[maxl + 5];
int ch[maxl + 1][maxs + 1], d[maxl + 1], name[maxl + 1], ps[maxl + 1], tt = 0;
vector<int> N[maxl + 1], P[maxl + 1];
int mat[maxn + 1];
void newn(int &x) {
  x = ++tt;
  d[x] = name[x] = ps[x] = 0;
}
void inser(char *s, int *a, int mark, int t) {
  int l = strlen(s);
  int x = 1;
  for (int i = 0; i <= l - 1; i++) {
    if (ch[x][s[i] - 'a' + 1] == 0) newn(ch[x][s[i] - 'a' + 1]);
    x = ch[x][s[i] - 'a' + 1];
  }
  a[x]++;
  if (t == 1) {
    N[x].push_back(mark);
  } else
    P[x].push_back(mark);
}
void read() {
  scanf("%d\n", &n);
  tt = 1;
  for (int i = 1; i <= n; i++) {
    scanf("%s\n", s);
    inser(s, name, i, 1);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%s\n", s);
    inser(s, ps, i, 2);
  }
}
int ans = 0;
void dfs(int x, int d) {
  for (int i = 1; i <= 26; i++) {
    if (ch[x][i]) dfs(ch[x][i], d + 1);
  }
  int a = 0, b = 0;
  for (int i = 1; i <= 26; i++) {
    if (ch[x][i] == 0) continue;
    a += name[ch[x][i]];
    b += ps[ch[x][i]];
    if (name[ch[x][i]]) {
      int k = ch[x][i];
      for (int i = N[k].size() - name[k]; i < N[k].size(); i++) {
        N[x].push_back(N[k][i]);
      }
    }
    if (ps[ch[x][i]]) {
      int k = ch[x][i];
      for (int i = P[k].size() - ps[k]; i < P[k].size(); i++) {
        P[x].push_back(P[k][i]);
      }
    }
  }
  a += name[x];
  b += ps[x];
  if (a >= b) {
    ans += d * b;
    name[x] = a - b;
    ps[x] = 0;
    for (int i = 0; i <= b - 1; i++) {
      mat[N[x][i]] = P[x][i];
    }
  } else {
    ans += d * a;
    name[x] = 0;
    ps[x] = b - a;
    for (int i = 0; i <= a - 1; i++) {
      mat[N[x][i]] = P[x][i];
    }
  }
}
void work() {
  dfs(1, 0);
  printf("%d\n", ans);
  for (int i = 1; i <= n; i++) {
    printf("%d %d\n", i, mat[i]);
  }
}
int main() {
  read();
  work();
  return 0;
}
