#include <bits/stdc++.h>
using namespace std;
struct Inp {
  string a;
  int b;
  Inp() {}
} I[100001];
int n;
map<string, bool> hav;
bool mark[1000001];
int tmp = 0;
bool check(string &s) {
  if (s[0] == '0') return false;
  tmp = 0;
  for (int i = 0; i < s.size(); i++) {
    if (s[i] < '0' || '9' < s[i]) return false;
    int d = (s[i] - '0');
    tmp = tmp * 10 + d;
  }
  mark[tmp] = true;
  return true;
}
string i_to_s(int x) {
  string z;
  while (x) {
    int d = x % 10;
    z += (d + '0');
    x /= 10;
  }
  reverse(z.begin(), z.end());
  return z;
}
vector<int> pos[2];
vector<string> cnt_out[2];
vector<pair<string, string> > res;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    cin >> I[i].a >> I[i].b;
    cnt += I[i].b;
  }
  for (int i = 1; i <= n; i++) {
    string s = I[i].a;
    hav[s] = true;
    int type = I[i].b;
    if (check(s) && tmp <= n) {
      if (tmp <= cnt && !type)
        pos[0].push_back(tmp);
      else if (tmp > cnt && type)
        pos[1].push_back(tmp);
    } else
      cnt_out[type].push_back(s);
  }
  int empty_pos = -1;
  int cur_type = -1;
  int ans = 0;
  int pos_0 = 0;
  int pos_1 = 0;
  if (cnt_out[0].empty() && cnt_out[1].empty()) {
    if (pos[0].empty() && pos[1].empty()) {
      cout << 0;
      return 0;
    }
    string z;
    for (int i = n + 1; i <= 999999; i++) {
      string zz = i_to_s(i);
      if (!hav[zz]) {
        z = zz;
        break;
      }
    }
    if (!pos[0].empty()) {
      mark[pos[0][pos_0]] = false;
      res.push_back(pair<string, string>(i_to_s(pos[0][pos_0]), z));
      empty_pos = pos[0][pos_0];
      cnt_out[0].push_back(z);
      pos_0 = 1;
      cur_type = 1;
    } else {
      mark[pos[1][pos_1]] = false;
      res.push_back(pair<string, string>(i_to_s(pos[1][pos_1]), z));
      empty_pos = pos[1][pos_1];
      cnt_out[1].push_back(z);
      pos_1 = 1;
      cur_type = 0;
    }
  } else
    for (int i = 1; i <= n; i++)
      if (!mark[i]) {
        empty_pos = i;
        if (i <= cnt)
          cur_type = 1;
        else
          cur_type = 0;
        break;
      }
  cerr << empty_pos << ' ' << cur_type << '\n';
  while (1) {
    if (cur_type == 1) {
      if (pos_1 >= pos[1].size()) {
        int pos_cnt_0 = 0;
        for (int i = cnt + 1; i <= n; i++)
          if (!mark[i]) {
            if (pos_cnt_0 < cnt_out[0].size()) {
              res.push_back(
                  pair<string, string>(cnt_out[0][pos_cnt_0], i_to_s(i)));
              pos_cnt_0++;
            } else {
              mark[pos[0][pos_0]] = false;
              res.push_back(
                  pair<string, string>(i_to_s(pos[0][pos_0]), i_to_s(i)));
              pos_0++;
            }
          }
        int pos_cnt_1 = 0;
        for (int i = 1; i <= cnt; i++)
          if (!mark[i]) {
            if (pos_cnt_1 < cnt_out[1].size()) {
              res.push_back(
                  pair<string, string>(cnt_out[1][pos_cnt_1], i_to_s(i)));
              pos_cnt_1++;
            } else {
              res.push_back(
                  pair<string, string>(i_to_s(pos[1][pos_1]), i_to_s(i)));
              pos_1++;
            }
          }
        break;
      }
      res.push_back(
          pair<string, string>(i_to_s(pos[1][pos_1]), i_to_s(empty_pos)));
      mark[empty_pos] = true;
      empty_pos = pos[1][pos_1];
      mark[empty_pos] = false;
      pos_1++;
      cur_type = 0;
    } else {
      if (pos_0 >= pos[0].size()) {
        int pos_cnt_1 = 0;
        for (int i = 1; i <= cnt; i++)
          if (!mark[i]) {
            if (pos_cnt_1 < cnt_out[1].size()) {
              res.push_back(
                  pair<string, string>(cnt_out[1][pos_cnt_1], i_to_s(i)));
              pos_cnt_1++;
            } else {
              mark[pos[1][pos_1]] = false;
              res.push_back(
                  pair<string, string>(i_to_s(pos[1][pos_1]), i_to_s(i)));
              pos_1++;
            }
          }
        int pos_cnt_0 = 0;
        for (int i = cnt + 1; i <= n; i++)
          if (!mark[i]) {
            if (pos_cnt_0 < cnt_out[0].size()) {
              res.push_back(
                  pair<string, string>(cnt_out[0][pos_cnt_0], i_to_s(i)));
              pos_cnt_0++;
            } else {
              res.push_back(
                  pair<string, string>(i_to_s(pos[0][pos_0]), i_to_s(i)));
              pos_0++;
            }
          }
        break;
      }
      res.push_back(
          pair<string, string>(i_to_s(pos[0][pos_0]), i_to_s(empty_pos)));
      mark[empty_pos] = true;
      empty_pos = pos[0][pos_0];
      mark[empty_pos] = false;
      pos_0++;
      cur_type = 1;
    }
  }
  cout << res.size() << '\n';
  for (int i = 0; i < res.size(); i++)
    cout << "move " << res[i].first << ' ' << res[i].second << '\n';
}
