#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
const int LEN = 8e5 + 7;
int n;
char s[LEN];
int t[26][LEN], nt;
vector<int> a[LEN], b[LEN];
int sum;
vector<pair<int, int> > ans;
inline void triePush(vector<int>* v, int x) {
  int cur = 0;
  for (int i = 0; s[i]; i++) {
    if (!t[s[i] - 'a'][cur]) {
      t[s[i] - 'a'][cur] = nt++;
    }
    cur = t[s[i] - 'a'][cur];
    if (!s[i + 1]) {
      v[cur].push_back(x);
    }
  }
}
inline void myMerge(vector<int>& u, vector<int>& p) {
  if (u.size() < p.size()) {
    p.insert(p.end(), u.begin(), u.end());
  } else {
    u.insert(u.end(), p.begin(), p.end());
    p.swap(u);
  }
  u.clear();
  u.shrink_to_fit();
}
inline void dfs(int u, int p, int d) {
  for (int i = 0; i < 26; i++) {
    if (t[i][u] != 0) {
      dfs(t[i][u], u, d + 1);
    }
  }
  while (a[u].size() && b[u].size()) {
    ans.push_back({a[u].back(), b[u].back()});
    a[u].pop_back();
    b[u].pop_back();
    sum += d;
  }
  myMerge(a[u], a[p]);
  myMerge(b[u], b[p]);
}
int main() {
  scanf("%d", &n);
  nt = 1;
  for (int i = 1; i <= n; i++) {
    scanf("%s", s);
    triePush(a, i);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%s", s);
    triePush(b, i);
  }
  dfs(0, -1, 0);
  printf("%d\n", sum);
  for (auto& x : ans) {
    printf("%d %d\n", x.first, x.second);
  }
}
