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