#include <bits/stdc++.h>
using namespace std;
const int MX = 800005;
const int MC = 26;
int M[MX];
long long ans[MX];
vector<int> vec1[MX], vec2[MX];
struct dat {
  unsigned char a, b, c;
  dat(int x = 0) {
    c = x % 256;
    x /= 256;
    b = x % 256;
    x /= 256;
    a = x;
  }
  int get() { return a * 256 * 256 + b * 256 + c; }
};
inline int get(char c) { return c - 'a'; }
struct Trie {
  int n, rt;
  dat chd[MX][MC];
  int dp[MX];
  vector<int> en[MX];
  vector<int> vec[MX];
  int newNode() {
    n++;
    fill_n(chd[n], MC, 0);
    return n;
  }
  void init() {
    n = 0;
    rt = newNode();
  }
  void insert(char *s, int sn, int id) {
    int u, i, c;
    u = rt;
    for (i = 0; i < sn; i++) {
      c = get(s[i]);
      if (!(chd[u][c].get())) chd[u][c] = dat(newNode());
      u = chd[u][c].get();
      vec[u].push_back(id);
      dp[u] = i + 1;
    }
    en[u].push_back(id);
  }
} T1, T2;
char s[MX];
void dfs(int u, int v) {
  vector<int> v1, v2;
  for (int i = 0; i < T1.en[u].size(); i++) vec1[u].push_back(T1.en[u][i]);
  for (int i = 0; i < T2.en[v].size(); i++) vec2[v].push_back(T2.en[v][i]);
  for (int i = 0; i < MC; i++) {
    if (T1.chd[u][i].get() and T2.chd[v][i].get()) {
      int u1 = T1.chd[u][i].get(), v1 = T2.chd[v][i].get();
      dfs(u1, v1);
      ans[u] += ans[u1];
      for (int j = 0; j < vec1[u1].size(); j++) vec1[u].push_back(vec1[u1][j]);
      for (int j = 0; j < vec2[v1].size(); j++) vec2[v].push_back(vec2[v1][j]);
      continue;
    }
    if (T1.chd[u][i].get()) {
      int uu = T1.chd[u][i].get();
      for (int j = 0; j < T1.vec[uu].size(); j++)
        vec1[u].push_back(T1.vec[uu][j]);
    }
    if (T2.chd[v][i].get()) {
      int uu = T2.chd[v][i].get();
      for (int j = 0; j < T2.vec[uu].size(); j++)
        vec2[v].push_back(T2.vec[uu][j]);
    }
  }
  int sz1 = vec1[u].size(), sz2 = vec2[v].size();
  ans[u] += 1LL * min(sz1, sz2) * T1.dp[u];
  for (int i = 0; i < min(sz1, sz2); i++) {
    M[vec1[u].back()] = vec2[v].back();
    vec1[u].pop_back();
    vec2[v].pop_back();
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%s", s);
    int l = strlen(s);
    T1.insert(s, l, i + 1);
  }
  for (int i = 0; i < n; i++) {
    scanf("%s", s);
    int l = strlen(s);
    T2.insert(s, l, i + 1);
  }
  dfs(0, 0);
  printf("%lld\n", ans[0]);
  for (int i = 1; i <= n; i++) {
    printf("%d %d\n", i, M[i]);
  }
  return 0;
}
