#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:336777216")
using namespace std;
const int MAXN = 100000 + 10;
const int MAXL = 6 + 1;
int N;
char Tmp[MAXL];
char NameExample[MAXN][MAXL], NameReal[MAXN][MAXL];
int Pnt[MAXN];
int nExample, nReal;
int Used[1000000];
vector<pair<int, int> > V;
int Parse(char* S) {
  if (S[0] == '0') return -1;
  int Ret = 0;
  for (int i = 0; S[i]; i++) {
    if (!isdigit(S[i])) return -1;
    Ret = Ret * 10 + S[i] - '0';
  }
  return Ret;
}
void Work() {
  scanf("%d", &N);
  for (int i = 0; i < N; i++) {
    int Type;
    scanf("%s%d", Tmp, &Type);
    if (Type == 1)
      strcpy(NameExample[nExample++], Tmp);
    else
      strcpy(NameReal[nReal++], Tmp);
  }
  memset(Used, -1, sizeof(Used));
  for (int i = 0; i < nExample; i++) {
    int ps = Parse(NameExample[i]);
    Pnt[i + 1] = ps;
    if (ps != -1) Used[ps] = i + 1;
    if (Pnt[i + 1] > N) Pnt[i + 1] = -1;
  }
  for (int i = 0; i < nReal; i++) {
    int ps = Parse(NameReal[i]);
    Pnt[i + nExample + 1] = ps;
    if (ps != -1) Used[ps] = nExample + i + 1;
    if (Pnt[i + nExample + 1] > N) Pnt[i + nExample + 1] = -1;
  }
  int IDLE = -1;
  for (int i = 233333;; i++)
    if (Used[i] == -1) {
      IDLE = i;
      break;
    }
  sprintf(NameReal[nReal], "%d", IDLE);
  set<int> idle1, idle2;
  set<int> wrong1, wrong2;
  for (int i = 1; i <= nExample; i++) {
    if (Used[i] == -1)
      idle1.insert(i);
    else if (Used[i] > nExample)
      wrong1.insert(i);
  }
  for (int i = 1; i <= nReal; i++) {
    if (Used[i + nExample] == -1)
      idle2.insert(i + nExample);
    else if (Used[i + nExample] <= nExample)
      wrong2.insert(i + nExample);
  }
  while (1) {
    if (wrong1.empty() && wrong2.empty()) break;
    if (!wrong1.empty() && !idle2.empty()) {
      int a = *wrong1.begin();
      int b = *idle2.begin();
      V.push_back(make_pair(Used[a], b));
      wrong1.erase(wrong1.begin());
      idle2.erase(idle2.begin());
      idle1.insert(a);
      continue;
    }
    if (!wrong2.empty() && !idle1.empty()) {
      int a = *wrong2.begin();
      int b = *idle1.begin();
      V.push_back(make_pair(Used[a], b));
      wrong2.erase(wrong2.begin());
      idle1.erase(idle1.begin());
      idle2.insert(a);
      continue;
    }
    int rang = *wrong1.begin();
    wrong1.erase(wrong1.begin());
    V.push_back(make_pair(Used[rang], IDLE));
    idle1.insert(rang);
    while (1) {
      if (wrong1.empty() && wrong2.empty()) break;
      if (!wrong1.empty() && !idle2.empty()) {
        int a = *wrong1.begin();
        int b = *idle2.begin();
        V.push_back(make_pair(Used[a], b));
        wrong1.erase(wrong1.begin());
        idle2.erase(idle2.begin());
        idle1.insert(a);
        continue;
      }
      if (!wrong2.empty() && !idle1.empty()) {
        int a = *wrong2.begin();
        int b = *idle1.begin();
        V.push_back(make_pair(Used[a], b));
        wrong2.erase(wrong2.begin());
        idle1.erase(idle1.begin());
        idle2.insert(a);
        continue;
      }
    }
    int kong = *idle2.begin();
    V.push_back(make_pair(N + 1, kong));
    idle2.erase(idle2.begin());
  }
  int Ans = V.size();
  for (int i = 1; i <= N; i++)
    if (Pnt[i] == -1) Ans++;
  printf("%d\n", Ans);
  for (auto p : V) {
    if (p.first <= nExample)
      printf("move %s %d\n", NameExample[p.first - 1], p.second);
    else
      printf("move %s %d\n", NameReal[p.first - 1 - nExample], p.second);
  }
  for (int i = 1; i <= N; i++)
    if (Pnt[i] == -1) {
      int to;
      if (i <= nExample) {
        to = *idle1.begin();
        idle1.erase(idle1.begin());
        printf("move %s %d\n", NameExample[i - 1], to);
      } else {
        to = *idle2.begin();
        idle2.erase(idle2.begin());
        printf("move %s %d\n", NameReal[i - 1 - nExample], to);
      }
    }
}
int main() {
  Work();
  return 0;
}
