#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
  int sig;
  int bz;
  char s[11];
  int get() {
    int len = strlen(s);
    int x = 0;
    if (s[0] == '0') return 0;
    for (int i = 0; i < len; i++)
      if (s[i] < '0' || s[i] > '9')
        return 0;
      else
        x = x * 10 + s[i] - '0';
    return x;
  }
} f[200000], g[200000], c[200000], d[200000];
int a[200000 * 4], b[200000 * 4];
int tot, m, calc, totc, totd;
int ans[200000][2];
void ins(int* f, int l, int r, int s, int ll, int v) {
  if (l == r) {
    f[s] = v;
    return;
  }
  if ((l + r) / 2 >= ll)
    ins(f, l, (l + r) / 2, s + s, ll, v);
  else
    ins(f, (l + r) / 2 + 1, r, s + s + 1, ll, v);
  f[s] = min(f[s + s], f[s + s + 1]);
}
int get(int* f, int l, int r, int s) {
  if (l == r) {
    f[s] = 1;
    return l;
  }
  if (!f[s + s]) {
    int x = get(f, l, (l + r) / 2, s + s);
    f[s] = min(f[s + s], f[s + s + 1]);
    return x;
  } else {
    int x = get(f, (l + r) / 2 + 1, r, s + s + 1);
    f[s] = min(f[s + s], f[s + s + 1]);
    return x;
  }
}
void clear(int* f, int l, int r, int s, int ll) {
  if (l == r) {
    f[s] = 0;
    return;
  }
  if ((l + r) / 2 >= ll)
    clear(f, l, (l + r) / 2, s + s, ll);
  else
    clear(f, (l + r) / 2 + 1, r, s + s + 1, ll);
  f[s] = min(f[s + s], f[s + s + 1]);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf(" %s %d", f[i].s, &f[i].sig);
    f[i].bz = i;
    m += f[i].sig;
  }
  for (int i = 1; i <= n; i++) {
    int x = f[i].get();
    if (x && x <= m) {
      ins(a, 1, m, 1, x, i);
      if (!f[i].sig) c[++totc] = f[i];
    } else if (x && x <= n) {
      ins(b, 1, n - m, 1, x - m, i);
      if (f[i].sig) d[++totd] = f[i];
    } else
      g[++tot] = f[i];
  }
  int lc = 1, ld = 1, extra = n;
  int tot1 = tot;
  while (lc <= totc || ld <= totd) {
    if (!b[1] && lc <= totc) {
      ans[++calc][0] = c[lc].bz;
      ans[calc][1] = get(b, 1, n - m, 1) + m;
      clear(a, 1, m, 1, c[lc].get());
      lc++;
    } else if (!a[1] && ld <= totd) {
      ans[++calc][0] = d[ld].bz;
      ans[calc][1] = get(a, 1, m, 1);
      clear(b, 1, n - m, 1, d[ld].get() - m);
      ld++;
    } else if (lc <= totc) {
      ans[++calc][0] = c[lc].bz;
      ans[calc][1] = ++extra;
      clear(a, 1, m, 1, c[lc].get());
      g[++tot] = c[lc];
      lc++;
    } else {
      ans[++calc][0] = d[ld].bz;
      ans[calc][1] = ++extra;
      clear(b, 1, n - m, 1, d[ld].get() - m);
      g[++tot] = d[ld];
      ld++;
    }
  }
  for (int i = 1; i <= tot1; i++)
    if (g[i].sig) {
      ans[++calc][0] = g[i].bz;
      ans[calc][1] = get(a, 1, m, 1);
    } else {
      ans[++calc][0] = g[i].bz;
      ans[calc][1] = get(b, 1, n - m, 1) + m;
    }
  for (int i = tot; i > tot1; i--)
    if (g[i].sig) {
      ans[++calc][0] = -(extra);
      extra--;
      ans[calc][1] = get(a, 1, m, 1);
    } else {
      ans[++calc][0] = -(extra);
      extra--;
      ans[calc][1] = get(b, 1, n - m, 1) + m;
    }
  printf("%d\n", calc);
  for (int i = 1; i <= calc; i++)
    if (ans[i][0] < 0)
      printf("move %d %d\n", -ans[i][0], ans[i][1]);
    else
      printf("move %s %d\n", f[ans[i][0]].s, ans[i][1]);
  return 0;
}
