#include <bits/stdc++.h>
using namespace std;
const int N = 2e5;
int gi() {
  int w = 0;
  bool q = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') q = 0, c = getchar();
  while (c >= '0' && c <= '9') w = w * 10 + c - '0', c = getchar();
  return q ? w : -w;
}
int head[N], next[N], to[N];
int id[N], p[N];
int num(char *s, int len) {
  if (s[0] == '0') return 0;
  int f = 0;
  for (int i = 0; i < len; i++) {
    if (s[i] < '0' || '9' < s[i]) return 0;
    f = f * 10 + s[i] - '0';
  }
  return f;
}
bool win[N];
int sec[N];
bool use[N];
string now[N];
struct DT {
  string a, b;
};
struct cmp {
  inline bool operator()(const int &a, const int &b) { return id[a] < id[b]; }
};
int main() {
  int n = gi(), i, s = 0, j, len, trans, all = n, x, y, k, pos = 0;
  long long h;
  set<long long> mp;
  char str[10];
  vector<DT> ans;
  for (i = 1; i <= n; s += sec[i++] = gi()) {
    scanf("%s", str);
    len = strlen(str);
    now[i] = str;
    if (0 < num(str, len) && num(str, len) <= n) id[i] = num(str, len);
    if (len == 6) {
      h = 0;
      for (j = 0; j < len; j++)
        h = h * 36 +
            ('0' <= str[j] && str[j] <= '9' ? str[j] - '0' : str[j] - 'a' + 10);
      mp.insert(h);
    }
  }
  for (i = 1; i <= n; i++)
    if (id[i] && (sec[i] == (id[i] <= s)))
      win[i] = true, use[id[i]] = true, id[i] = 0, all--;
  stack<int> a, b;
  priority_queue<int, vector<int>, cmp> A, B;
  for (i = 1; i <= n; i++)
    if (id[i]) p[id[i]] = i;
  for (i = 1; i <= n; i++)
    if (!use[i] && !p[i]) (i <= s ? a : b).push(i);
  for (i = 1; i <= n; i++)
    if (!win[i]) (sec[i] ? A : B).push(i);
  trans = 0;
  while (all--)
    if (!a.empty() && !A.empty()) {
      x = a.top();
      y = A.top();
      a.pop();
      A.pop();
      ans.push_back((DT){now[y], to_string(x)});
      if (id[y]) b.push(id[y]);
    } else if (!b.empty() && !B.empty()) {
      x = b.top(), y = B.top();
      b.pop();
      B.pop();
      ans.push_back((DT){now[y], to_string(x)});
      if (id[y]) a.push(id[y]);
    } else {
      for (++trans; mp.count(trans); trans++)
        ;
      for (j = 5, k = trans; j >= 0; j--) {
        str[j] = k % 36 < 10 ? k % 36 + '0' : k % 36 - 10 + 'a';
        k /= 36;
      }
      str[6] = 0;
      pos = k = A.top();
      A.pop();
      string t = str;
      ans.push_back((DT){now[k], t});
      now[k] = t;
      b.push(id[k]);
      id[k] = 0;
    }
  if (pos)
    ans.push_back((DT){now[pos], to_string(a.empty() ? b.top() : a.top())});
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("move %s %s\n", ans[i].a.c_str(), ans[i].b.c_str());
  return 0;
}
