#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const char *alpha = "abcdefghijklmnopqrstuvwxyz0123456789";
map<string, bool> has;
queue<string> q0, q1;
queue<int> que0, que1;
queue<pair<string, int> > q2;
pair<string, string> ans[maxn << 1];
pair<string, int> b[maxn];
bool used[maxn];
char s[maxn];
string get_rand() {
  while (true) {
    string ret;
    for (int i = 0; i < 6; ++i) ret.push_back(alpha[rand() % 36]);
    if (has.find(ret) == has.end()) {
      has[ret] = true;
      return ret;
    }
  }
}
int change(const string &s) {
  if (s[0] == '0') return -1;
  int ret = 0;
  for (int i = 0; i < s.size(); ++i) {
    if (s[i] > '9' || s[i] < '0') return -1;
    ret = ret * 10 + s[i] - '0';
  }
  return ret;
}
string changes(int x) {
  string ret;
  while (x) {
    ret.push_back(x % 10 + '0');
    x /= 10;
  }
  reverse(ret.begin(), ret.end());
  return ret;
}
int main() {
  int n;
  scanf("%d", &n);
  int num1 = 0;
  for (int i = 1; i <= n; ++i) {
    int t;
    scanf("%s%d", s, &t);
    b[i] = pair<string, int>(s, t);
    has[s] = true;
    if (t == 1) ++num1;
  }
  for (int i = 1; i <= n; ++i) {
    int num = change(b[i].first);
    if (num >= 1 && num <= num1) {
      used[num] = true;
      if (b[i].second == 0) q1.push(b[i].first);
    } else if (num > num1 && num <= n) {
      used[num] = true;
      if (b[i].second == 1) q0.push(b[i].first);
    } else {
      q2.push(b[i]);
    }
  }
  int cnt = 0;
  for (int i = 1; i <= num1; ++i)
    if (!used[i]) que1.push(i);
  for (int i = num1 + 1; i <= n; ++i)
    if (!used[i]) que0.push(i);
  if (!q0.empty() || !q1.empty()) {
    string tmp = get_rand();
    if (q2.empty()) {
      if (!q0.empty()) {
        string tname = get_rand();
        string name = q0.front();
        q0.pop();
        ans[cnt++] = pair<string, string>(name, tname);
        q2.push(pair<string, int>(tname, 1));
        que0.push(change(name));
      } else {
        string tname = get_rand();
        string name = q1.front();
        q1.pop();
        ans[cnt++] = pair<string, string>(name, tname);
        q2.push(pair<string, int>(tname, 0));
        que1.push(change(name));
      }
    }
    while (!q0.empty() || !q1.empty()) {
      if (!q0.empty() && !que1.empty()) {
        string name = q0.front();
        int num = que1.front();
        q0.pop(), que1.pop();
        ans[cnt++] = pair<string, string>(name, changes(num));
        que0.push(change(name));
      } else {
        string name = q1.front();
        int num = que0.front();
        q1.pop(), que0.pop();
        ans[cnt++] = pair<string, string>(name, changes(num));
        que1.push(change(name));
      }
    }
  }
  while (!q2.empty()) {
    pair<string, int> p = q2.front();
    q2.pop();
    if (p.second == 0) {
      ans[cnt++] = pair<string, string>(p.first, changes(que0.front()));
      que0.pop();
    } else {
      ans[cnt++] = pair<string, string>(p.first, changes(que1.front()));
      que1.pop();
    }
  }
  printf("%d\n", cnt);
  for (int i = 0; i < cnt; ++i)
    printf("move %s %s\n", ans[i].first.c_str(), ans[i].second.c_str());
  return 0;
}
