#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1001000;
const int cc = 26;
int sig[MAXN][cc];
vector<int> v[MAXN][2];
int cnt;
inline int C(char c) { return int(c - 'a'); }
void add(int id, int op) {
  int x = 0;
  char aux;
  while (1) {
    aux = getchar();
    if (aux == '\n') break;
    int c = C(aux);
    if (!sig[x][c]) {
      sig[x][c] = cnt++;
    }
    x = sig[x][c];
  }
  v[x][op].push_back(id + 1);
}
int ans, resp[100010];
void dfs(int u, int len, int last) {
  for (int i = int(0); i < int(cc); i++)
    if (sig[u][i]) dfs(sig[u][i], len + 1, u);
  while (v[u][0].size() && v[u][1].size()) {
    ans += len;
    resp[v[u][0][v[u][0].size() - 1]] = v[u][1][v[u][1].size() - 1];
    v[u][0].pop_back();
    v[u][1].pop_back();
  }
  while (v[u][0].size()) {
    v[last][0].push_back(v[u][0][v[u][0].size() - 1]);
    v[u][0].pop_back();
  }
  while (v[u][1].size()) {
    v[last][1].push_back(v[u][1][v[u][1].size() - 1]);
    v[u][1].pop_back();
  }
  return;
}
int main() {
  int n;
  cnt = 1, ans = 0;
  cin >> n;
  cin.ignore();
  for (int i = int(0); i < int(n); i++) add(i, 0);
  for (int i = int(0); i < int(n); i++) add(i, 1);
  dfs(0, 0, 0);
  printf("%d\n", ans);
  for (int i = int(1); i < int(n + 1); i++) printf("%d %d\n", i, resp[i]);
  return 0;
}
