#include <bits/stdc++.h>
using namespace std;
struct node {
  int fa;
  int ch[26];
  vector<int> s, p;
};
long long ans;
int res[820000];
char str[820000];
struct trie {
  node a[820000];
  int siz;
  trie() { siz = 1; }
  inline void addstu(int ll, int x) {
    int pos = 1;
    for (int i = 1; i <= ll; i++) {
      int cur = str[i] - 'a';
      if (a[pos].ch[cur] == 0) {
        siz++;
        a[siz].fa = pos;
        a[pos].ch[cur] = siz;
      }
      pos = a[pos].ch[cur];
    }
    a[pos].s.push_back(x);
  }
  inline void addpse(int ll, int x) {
    int pos = 1;
    for (int i = 1; i <= ll; i++) {
      int cur = str[i] - 'a';
      if (a[pos].ch[cur] == 0) {
        siz++;
        a[siz].fa = pos;
        a[pos].ch[cur] = siz;
      }
      pos = a[pos].ch[cur];
    }
    a[pos].p.push_back(x);
  }
  inline void dfs(int x) {
    for (int i = 0; i < 26; i++) {
      if (a[x].ch[i] != 0) {
        dfs(a[x].ch[i]);
      }
    }
    int ss = a[x].s.size();
    int ps = a[x].p.size();
    int sp = min(ss, ps);
    for (int i = 0; i < sp; i++) {
      res[a[x].s[i]] = a[x].p[i];
    }
    for (int i = sp; i < ss; i++) {
      a[a[x].fa].s.push_back(a[x].s[i]);
      ans--;
    }
    for (int i = sp; i < ps; i++) {
      a[a[x].fa].p.push_back(a[x].p[i]);
      ans--;
    }
  }
  inline void solve() { dfs(1); }
} sgt;
int n, m, l;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%s", str + 1);
    l = strlen(str + 1);
    ans += l;
    sgt.addstu(l, i);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%s", str + 1);
    l = strlen(str + 1);
    ans += l;
    sgt.addpse(l, i);
  }
  sgt.solve();
  printf("%I64d\n", ans / 2);
  for (int i = 1; i <= n; i++) {
    printf("%d %d\n", i, res[i]);
  }
  return 0;
}
