#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1000000000")
using namespace std;
using pii = pair<int, int>;
using ll = long long;
using pll = pair<long long, long long>;
using pil = pair<int, long long>;
using vi = vector<int>;
using vll = vector<long long>;
using vs = vector<string>;
using vc = vector<char>;
using vb = vector<bool>;
using vpii = vector<pair<int, int>>;
using vd = vector<double>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
using pdd = pair<double, double>;
using pss = pair<string, string>;
const ll mod = 1e9 + 7;
const ll INF = 1e18;
string q;
vpii matching;
int n;
struct node {
  vi ids;
  map<char, node *> children;
  node() {}
};
struct trie {
  node *root;
  trie() { root = new node(); }
  void insert(string &word, int idx) {
    node *cur = root;
    for (auto &wi : word) {
      if (!cur->children.count(wi)) cur->children[wi] = new node();
      cur = cur->children[wi];
    }
    cur->ids.push_back(idx);
  }
  ll calc(node *tnode, list<int> &v1, list<int> &v2, int len) {
    ll ans = 0;
    for (auto &to : tnode->children) {
      list<int> l1, l2;
      ans += calc(to.second, l1, l2, len + 1);
      v1.splice(v1.begin(), l1);
      v2.splice(v2.begin(), l2);
    }
    for (auto &id : tnode->ids) {
      if (id < n)
        v1.emplace_back(id);
      else
        v2.emplace_back(id);
    }
    while (!v1.empty() and !v2.empty()) {
      int x = v1.back(), y = v2.back();
      v1.pop_back(), v2.pop_back();
      matching.emplace_back(x + 1, y - n + 1);
      ans += len;
    }
    return ans;
  }
} tr;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  vi a;
  for (int i = 0; i < 2 * n; i++) {
    cin >> q;
    tr.insert(q, i);
  }
  list<int> l1, l2;
  ll ans = tr.calc(tr.root, l1, l2, 0);
  cout << ans << '\n';
  for (auto &x : matching) cout << x.first << ' ' << x.second << '\n';
  return 0;
}
