#include <bits/stdc++.h>   using namespace std;   using namespace std::chrono;   const int MAXN = 100500;   bool is_occupied[MAXN];   string names[MAXN];   int types[MAXN];   vector<string> nonex_bad;   vector<string> ex_bad;   vector<string> ex_neutral, nonex_neutral;   bool is_bogus_name(string const& fname) {     if (fname[0] ==  0 ) return true;     if (not all_of(fname.begin(), fname.end(), [](char x) { return isdigit(x); }))       return true;     return false;   }   bool is_ex_filename(int ex_num, string const& fname) {     if (is_bogus_name(fname)) return false;     int ret = stoi(fname);     return 1 <= ret and ret <= ex_num;   }   bool is_nonex_filename(int ex_num, int all_num, string const& fname) {     if (is_bogus_name(fname)) return false;     int ret = stoi(fname);     return ex_num + 1 <= ret and ret <= all_num;   }   int main() {     cin.sync_with_stdio(false);     cin.tie(0);     int n;     int ex_num = 0;     set<string> all_names;     cin >> n;     for (int i = 0; i < n; i++) {       string name;       int is_ex;       cin >> name >> is_ex;       all_names.insert(name);       ex_num += is_ex;       names[i] = name;       types[i] = is_ex;     }     int cnt_ok = 0;     for (int i = 0; i < n; i++) {       bool is_ex = is_ex_filename(ex_num, names[i]);       bool is_nonex = is_nonex_filename(ex_num, n, names[i]);       if (is_ex or is_nonex) {         is_occupied[stoi(names[i])] = true;       }       if (is_ex && types[i]) {         cnt_ok++;         continue;       }       if (is_nonex && !types[i]) {         cnt_ok++;         continue;       }       if (not is_ex and not is_nonex) {         if (types[i])           ex_neutral.push_back(names[i]);         else           nonex_neutral.push_back(names[i]);         continue;       }       if (types[i])         ex_bad.push_back(names[i]);       else         nonex_bad.push_back(names[i]);     }     if (cnt_ok == n) {       cout <<  0  << endl;       return 0;     }     int free_slot = -1;     vector<pair<string, string>> moves;     for (int i = 1; i <= n; i++) {       if (not is_occupied[i]) {         free_slot = i;         break;       }     }     if (free_slot == -1) {       string move_to;       for (int i = 0; i < MAXN; i++) {         string cur = to_string(i);         while (cur.size() < 6) cur =  0  + cur;         if (all_names.count(cur) == 0) {           move_to = cur;           break;         }       }       if (not ex_bad.empty()) {         free_slot = stoi(ex_bad.back());         is_occupied[free_slot] = false;         moves.push_back({ex_bad.back(), move_to});         ex_neutral.push_back(move_to);         ex_bad.pop_back();       } else if (not nonex_bad.empty()) {         free_slot = stoi(nonex_bad.back());         is_occupied[free_slot] = false;         moves.push_back({nonex_bad.back(), move_to});         nonex_neutral.push_back(move_to);         nonex_bad.pop_back();       } else         exit(1);     }     while (not ex_bad.empty() and not nonex_bad.empty()) {       if (1 <= free_slot and free_slot <= ex_num) {         int idx = stoi(ex_bad.back());         moves.push_back({ex_bad.back(), to_string(free_slot)});         is_occupied[free_slot] = true;         is_occupied[idx] = false;         free_slot = idx;         ex_bad.pop_back();       } else {         int idx = stoi(nonex_bad.back());         moves.push_back({nonex_bad.back(), to_string(free_slot)});         is_occupied[free_slot] = true;         is_occupied[idx] = false;         free_slot = idx;         nonex_bad.pop_back();       }     }     for (int i = 1; not ex_bad.empty() and i <= ex_num; i++) {       if (not is_occupied[i]) {         is_occupied[i] = true;         moves.push_back({ex_bad.back(), to_string(i)});         is_occupied[stoi(ex_bad.back())] = false;         ex_bad.pop_back();       }     }     for (int i = ex_num + 1; not nonex_bad.empty() and i <= n; i++) {       if (not is_occupied[i]) {         is_occupied[i] = true;         moves.push_back({nonex_bad.back(), to_string(i)});         is_occupied[stoi(nonex_bad.back())] = false;         nonex_bad.pop_back();       }     }     for (int i = 1; not ex_neutral.empty() and i <= ex_num; i++) {       if (not is_occupied[i]) {         is_occupied[i] = true;         moves.push_back({ex_neutral.back(), to_string(i)});         ex_neutral.pop_back();       }     }     for (int i = ex_num + 1; not nonex_neutral.empty() and i <= n; i++) {       if (not is_occupied[i]) {         is_occupied[i] = true;         moves.push_back({nonex_neutral.back(), to_string(i)});         nonex_neutral.pop_back();       }     }     cout << moves.size() <<   n ;     for (auto const& p : moves) {       cout <<  move   << p.first <<     << p.second <<   n ;     }     return 0;   }