#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXN = 100000;
const int MAXLEN = 6;
int n;
char name[MAXN][MAXLEN + 1];
int pname[MAXN];
int ex[MAXN];
int usedby[MAXN + 1];
vector<int> wrongex, wrongrg, otherex, otherrg;
pair<int, int> ret[MAXN + 1];
int nret;
int parse(char *s) {
  int ret = 0;
  for (int i = 0; s[i] != '\0'; ++i)
    if (!isdigit(s[i]) || s[i] == '0' && i == 0)
      return -1;
    else
      ret = ret * 10 + s[i] - '0';
  if (ret < 1 || ret > n) return -1;
  return ret;
}
void run() {
  scanf("%d", &n);
  for (int i = (0); i < (n); ++i) scanf("%s%d", &name[i], &ex[i]);
  for (int i = (1); i <= (n); ++i) usedby[i] = -1;
  for (int i = (0); i < (n); ++i) {
    int x = parse(name[i]);
    pname[i] = x;
    if (x == -1) continue;
    usedby[x] = i;
  }
  int numex = 0;
  for (int i = (0); i < (n); ++i) numex += ex[i];
  int unusedex = -1, unusedrg = -1;
  for (int i = (1); i <= (numex); ++i)
    if (usedby[i] == -1) {
      unusedex = i;
      break;
    }
  for (int i = (numex + 1); i <= (n); ++i)
    if (usedby[i] == -1) {
      unusedrg = i;
      break;
    }
  for (int i = (0); i < (n); ++i)
    if (ex[i] == 1)
      if (pname[i] == -1)
        otherex.push_back(i);
      else if (pname[i] > numex)
        wrongex.push_back(i);
  for (int i = (0); i < (n); ++i)
    if (ex[i] == 0)
      if (pname[i] == -1)
        otherrg.push_back(i);
      else if (pname[i] <= numex)
        wrongrg.push_back(i);
  nret = 0;
  int altname = -1;
  while (true) {
    if (unusedex != -1 && ((int)(wrongex).size()) > 0) {
      int at = wrongex.back();
      wrongex.pop_back();
      ret[nret++] = make_pair(at, unusedex);
      usedby[unusedex] = at;
      usedby[pname[at]] = -1;
      unusedex = -1;
      unusedrg = pname[at];
      continue;
    }
    if (unusedrg != -1 && ((int)(wrongrg).size()) > 0) {
      int at = wrongrg.back();
      wrongrg.pop_back();
      ret[nret++] = make_pair(at, unusedrg);
      usedby[unusedrg] = at;
      usedby[pname[at]] = -1;
      unusedrg = -1;
      unusedex = pname[at];
      continue;
    }
    if (((int)(wrongex).size()) > 0 && ((int)(wrongrg).size()) > 0) {
      int at = wrongex.back();
      wrongex.pop_back();
      ret[nret++] = make_pair(at, n + 1);
      usedby[pname[at]] = -1;
      unusedrg = pname[at];
      otherex.push_back(at);
      altname = at;
      continue;
    }
    break;
  }
  if (((int)(wrongex).size()) > 0 && ((int)(wrongrg).size()) == 0)
    for (int i = (1); i <= (numex); ++i)
      if (((int)(wrongex).size()) > 0 && usedby[i] == -1) {
        int at = wrongex.back();
        wrongex.pop_back();
        ret[nret++] = make_pair(at, i);
        usedby[i] = at;
        usedby[pname[at]] = -1;
      }
  if (((int)(wrongrg).size()) > 0 && ((int)(wrongex).size()) == 0)
    for (int i = (numex + 1); i <= (n); ++i)
      if (((int)(wrongrg).size()) > 0 && usedby[i] == -1) {
        int at = wrongrg.back();
        wrongrg.pop_back();
        ret[nret++] = make_pair(at, i);
        usedby[i] = at;
        usedby[pname[at]] = -1;
      }
  for (int i = (1); i <= (numex); ++i)
    if (((int)(otherex).size()) > 0 && usedby[i] == -1) {
      int at = otherex.back();
      otherex.pop_back();
      ret[nret++] = make_pair(at == altname ? -1 : at, i);
      usedby[i] = at;
    }
  for (int i = (numex + 1); i <= (n); ++i)
    if (((int)(otherrg).size()) > 0 && usedby[i] == -1) {
      int at = otherrg.back();
      otherrg.pop_back();
      ret[nret++] = make_pair(at, i);
      usedby[i] = at;
    }
  printf("%d\n", nret);
  for (int i = (0); i < (nret); ++i)
    if (ret[i].first == -1)
      printf("move %d %d\n", n + 1, ret[i].second);
    else
      printf("move %s %d\n", name[ret[i].first], ret[i].second);
}
int main() {
  run();
  return 0;
}
