← Home
# include <bits/stdc++.h>
using namespace std;
# define ii pair<int, int>
# define vt vector <int>
# define ll long long
struct Node{
    Node *child[26];
    vt schools, companies;
    Node(){
        for (int i=0; i<26; i++) child[i]=nullptr;
    }
};
ll total_lcp=0;
vector<ii> matches;
void inserts(Node *root, const string &s, int id, bool is_school){
    Node *curr=root;
    for (char c:s){
        int idx=c-'a';
        if (!curr->child[idx]) curr->child[idx]=new Node();
        curr=curr->child[idx];
    }
    if (is_school) curr->schools.push_back(id);
    else curr->companies.push_back(id);
}
void dfs(Node *curr, int depth){
    for (int i=0; i<26; i++){
        if (curr->child[i]){
            dfs(curr->child[i], depth+1);
            for (int id:curr->child[i]->schools)
                curr->schools.push_back(id);
            for (int id:curr->child[i]->companies)
                curr->companies.push_back(id);
            delete curr->child[i];
            curr->child[i]=nullptr;
        }
    }
    // Ghep cap nut hien tai
    while (!curr->schools.empty()&&!curr->companies.empty()){
        matches.push_back({curr->schools.back(),
                          curr->companies.back()});
        curr->schools.pop_back();
        curr->companies.pop_back();
        total_lcp+=depth;
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //ifstream cin ("a.inp");
    int n; cin >> n;
    Node *root=new Node();
    for (int i=1; i<=n; i++){
        string s; cin >> s;
        inserts(root,s,i,true);
    }
    for (int i=1; i<=n; i++){
        string s; cin >> s;
        inserts(root,s,i,false);
    }
    dfs(root, 0);
    cout << total_lcp <<"\n";
    for (auto &p:matches)
        cout << p.first <<" "<<p.second<< "\n";
    delete root;
}