#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
template <class T>
T gcd(T a, T b) {
  return a ? gcd(b % a, a) : b;
}
template <class T>
T sqr(T a) {
  return a * a;
}
template <class T>
T sgn(T a) {
  return a > 0 ? 1 : (a < 0 ? -1 : 0);
}
int n;
int m;
const int N = 1e6;
map<char, int> a[N];
vector<int> b[N], c[N];
char s[N];
int cnt, ans[N];
void go(int cur, int h) {
  for (auto r : a[cur]) {
    int next = r.second;
    if (next != cur) go(next, h + 1);
    while ((((int)(b[cur]).size()) || ((int)(b[next]).size())) &&
           (((int)(c[cur]).size()) || ((int)(c[next]).size()))) {
      int curb, curc;
      if (((int)(b[cur]).size()))
        curb = b[cur].back(), b[cur].pop_back();
      else
        curb = b[next].back(), b[next].pop_back();
      if (((int)(c[cur]).size()))
        curc = c[cur].back(), c[cur].pop_back();
      else
        curc = c[next].back(), c[next].pop_back();
      ans[curb] = curc;
      cnt += h;
    }
    if (next != cur) {
      b[cur].insert(b[cur].end(), (b[next]).begin(), (b[next]).end());
      c[cur].insert(c[cur].end(), (c[next]).begin(), (c[next]).end());
      b[next].clear();
      c[next].clear();
    }
  }
}
string sa[N], sb[N];
int main() {
  scanf("%d ", &n);
  int m = 1;
  for (int i = 0; i < n; i++) {
    gets(s);
    sa[i] = string(s);
    int l = strlen(s);
    int cur = 0;
    for (int j = 0; j < l; j++) {
      if (a[cur].count(s[j]) == 0) {
        a[cur][s[j]] = m;
        cur = m;
        a[m]['$'] = m;
        m++;
      } else
        cur = a[cur][s[j]];
    }
    b[cur].push_back(i);
  }
  for (int i = 0; i < n; i++) {
    gets(s);
    sb[i] = string(s);
    int l = strlen(s);
    int cur = 0;
    for (int j = 0; j < l && a[cur].count(s[j]); j++) cur = a[cur][s[j]];
    c[cur].push_back(i);
  }
  go(0, 0);
  printf("%d\n", cnt);
  for (int i = 0; i < n; i++) printf("%d %d\n", i + 1, ans[i] + 1);
  return 0;
}
