#include <bits/stdc++.h>
using namespace std;
const int MAXN = 101010;
struct Trie {
  vector<int> vid;
  Trie *ch[26];
};
int N;
string s[MAXN * 2];
Trie *root;
vector<pair<int, int> > match;
void make_trie() {
  root = new Trie();
  for (int i = 0; i < 2 * N; i++) {
    Trie *tr = root;
    for (auto c : s[i]) {
      int nxt = c - 'a';
      if (!tr->ch[nxt]) tr->ch[nxt] = new Trie();
      tr = tr->ch[nxt];
    }
    tr->vid.push_back(i);
  }
}
long long calc(Trie *tr, list<int> &v1, list<int> &v2, int dep) {
  if (!tr) return 0;
  long long ans = 0;
  for (int i = 0; i < 26; i++) {
    if (tr->ch[i]) {
      list<int> l1, l2;
      ans += calc(tr->ch[i], l1, l2, dep + 1);
      v1.splice(v1.begin(), l1);
      v2.splice(v2.begin(), l2);
    }
  }
  for (auto x : tr->vid) {
    if (x < N)
      v1.push_back(x);
    else
      v2.push_back(x);
  }
  while (!v1.empty() && !v2.empty()) {
    int x = v1.back();
    int y = v2.back();
    v1.pop_back();
    v2.pop_back();
    match.push_back(make_pair(x + 1, y - N + 1));
    ans += dep;
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> N;
  for (int i = 0; i < 2 * N; i++) cin >> s[i];
  make_trie();
  list<int> v1, v2;
  long long ans = calc(root, v1, v2, 0);
  cout << ans << "\n";
  for (auto p : match) cout << p.first << " " << p.second << "\n";
  return 0;
}
