#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;
}
