#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100005;
int n;
map<int, vector<pair<int, int> > > cubes;
long long best[MAX_N];
int from[MAX_N];
inline bool cmp(int a, int b) { return cubes[a].size() < cubes[b].size(); }
int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    int color, size;
    cin >> color >> size;
    cubes[color].push_back(make_pair(size, i));
  }
  for (typeof((cubes).begin()) it = (cubes).begin(); it != (cubes).end(); ++it)
    sort(it->second.rbegin(), it->second.rend());
  vector<int> order;
  for (typeof((cubes).begin()) it = (cubes).begin(); it != (cubes).end(); ++it)
    order.push_back(it->first);
  sort(order.rbegin(), order.rend(), cmp);
  long long sol = 0, c1 = 0, c2 = 0;
  for (typeof((order).begin()) color = (order).begin(); color != (order).end();
       ++color) {
    int cube_cnt = cubes[*color].size();
    long long size_sum = 0;
    for (typeof((cubes[*color]).begin()) cube = (cubes[*color]).begin();
         cube != (cubes[*color]).end(); ++cube)
      size_sum += cube->first;
    if (best[cube_cnt + 1] > 0 && best[cube_cnt + 1] + size_sum > sol) {
      sol = best[cube_cnt + 1] + size_sum;
      c1 = *color;
      c2 = from[cube_cnt + 1];
    }
    if (best[cube_cnt] > 0 && best[cube_cnt] + size_sum > sol) {
      sol = best[cube_cnt] + size_sum;
      c1 = *color;
      c2 = from[cube_cnt];
    }
    long long sum = 0;
    for (size_t i = 0; i < cubes[*color].size(); ++i) {
      sum += (cubes[*color])[i].first;
      if (sum > best[i + 1]) {
        best[i + 1] = sum;
        from[i + 1] = *color;
      }
    }
  }
  cout << sol << "\n";
  int tower_len = 2 * cubes[c1].size() + (cubes[c1].size() < cubes[c2].size());
  cout << tower_len << "\n";
  for (int stp = 1, p1 = 0, p2 = 0; stp <= tower_len; ++stp) {
    if (stp & 1) {
      cout << cubes[c2][p2].second << " ";
      ++p2;
    } else {
      cout << cubes[c1][p1].second << " ";
      ++p1;
    }
  }
}
