#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
vector<vector<int> > g, cn;
vector<int> us, pn;
vector<long long> sz;
long long ans = 0, same = 0;
void merge(int &a, int &b) {
  if (cn[a].size() < cn[b].size()) swap(a, b);
  for (int j = cn[a].size() - 1; j - (int)cn[a].size() + (int)cn[b].size() >= 0;
       j--) {
    same += cn[a][j] * cn[b][j - cn[a].size() + cn[b].size()];
    cn[a][j] += cn[b][j - cn[a].size() + cn[b].size()];
  }
  return;
}
pair<int, int> dfs(int v) {
  sz[v] = 1;
  for (int i : g[v]) {
    auto x = dfs(i);
    sz[v] += x.second;
    merge(pn[v], x.first);
  }
  for (int i : g[v]) {
    ans += (sz[v] - 1) * (sz[i]);
  }
  cn[pn[v]].push_back(1);
  return {pn[v], sz[v]};
}
int f(string s) {
  if (s[0] == '0') return -1;
  int res = 0;
  for (char c : s) {
    if (c < '0' || c > '9') return -1;
    res = (10 * res) + (c - '0');
  }
  return res;
}
string LS = "100001";
int _LS = 100001;
int main() {
  iostream::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  int n;
  cin >> n;
  int e = 0;
  vector<string> a(n);
  vector<int> pos(n), ty(n);
  bool free = 0;
  for (int i = 0; i < n; i++) {
    string s;
    int t;
    cin >> s >> t;
    a[i] = s;
    ty[i] = t;
    e += t;
    int x = f(s);
    if (x == -1 || x > n) {
      pos[i] = _LS;
      free = 1;
    } else
      pos[i] = x;
  }
  set<int> fr, sc;
  for (int i = 1; i <= e; i++) fr.insert(i);
  for (int i = e + 1; i <= n; i++) sc.insert(i);
  bool bad = 0;
  for (int i = 0; i < n; i++) {
    if (pos[i] == _LS) continue;
    if (pos[i] <= e)
      fr.erase(pos[i]);
    else
      sc.erase(pos[i]);
    if (ty[i] && pos[i] > e || !ty[i] && pos[i] <= e) bad = 1;
  }
  if (!bad) {
    vector<pair<int, int> > ans;
    for (int i = 0; i < n; i++) {
      if (pos[i] != _LS) continue;
      if (ty[i]) {
        ans.push_back({i, *fr.begin()});
        fr.erase(fr.begin());
      } else {
        ans.push_back({i, *sc.begin()});
        sc.erase(sc.begin());
      }
    }
    cout << ans.size() << '\n';
    for (auto i : ans) {
      cout << "move " << a[i.first] << ' ' << i.second << '\n';
    }
    return 0;
  }
  vector<pair<string, int> > ans;
  int rev = -1;
  if (!free) {
    for (int i = 0; i < n; i++) {
      if (ty[i] && pos[i] > e || !ty[i] && pos[i] <= e) {
        rev = i;
        if (pos[rev] <= e)
          fr.insert(pos[rev]);
        else
          sc.insert(pos[rev]);
        ans.push_back({a[rev], _LS});
        a[rev] = LS;
        pos[rev] = _LS;
        break;
      }
    }
  }
  set<int> fs, sf;
  for (int i = 0; i < n; i++) {
    if (pos[i] == _LS) continue;
    if (ty[i] && pos[i] <= e || !ty[i] && pos[i] > e) continue;
    if (ty[i])
      sf.insert(i);
    else
      fs.insert(i);
  }
  while (fs.size() || sf.size()) {
    while (fs.size()) {
      if (!sc.size()) break;
      int to = *sc.begin(), from = *fs.begin();
      ans.push_back({a[from], to});
      sc.erase(to);
      fs.erase(from);
      fr.insert(pos[from]);
      pos[from] = to;
    }
    while (sf.size()) {
      if (!fr.size()) break;
      int to = *fr.begin(), from = *sf.begin();
      ans.push_back({a[from], to});
      fr.erase(to);
      sf.erase(from);
      sc.insert(pos[from]);
      pos[from] = to;
    }
  }
  for (int i = 0; i < n; i++) {
    if (pos[i] != _LS) continue;
    if (ty[i]) {
      ans.push_back({a[i], *fr.begin()});
      fr.erase(fr.begin());
    } else {
      ans.push_back({a[i], *sc.begin()});
      sc.erase(sc.begin());
    }
  }
  cout << ans.size() << '\n';
  for (auto i : ans) {
    cout << "move " << i.first << ' ' << i.second << '\n';
  }
  return 0;
}
