#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
struct cub {
  int nom;
  long long size;
  cub() : size(numeric_limits<long long>::min()) {}
  cub(int nom, int size) : nom(nom), size(size) {}
  friend bool operator<(const cub& a, const cub& b) { return a.size > b.size; }
};
struct clrnum {
  int num;
  static int curnum;
  clrnum() : num(curnum++) {}
  operator int() { return num; }
};
int clrnum::curnum = 0;
bool asd(const vector<cub>& a, const vector<cub>& b) {
  return a.size() > b.size();
}
int main() {
  int n, l_color = 0;
  cin >> n;
  map<int, clrnum> colors;
  vector<vector<cub> > cubes;
  for (int i = 0, c, s; i < n; ++i) {
    cin >> c >> s;
    int indc = colors[c];
    if (indc >= cubes.size()) cubes.resize(indc + 1);
    cubes[indc].push_back(cub(i + 1, s));
  }
  sort(cubes.begin(), cubes.end(), asd);
  for (vector<vector<cub> >::iterator it = cubes.begin(); it != cubes.end();
       ++it) {
    sort(it->begin(), it->end());
    long long psize = it->begin()->size;
    for (vector<cub>::iterator ci = it->begin() + 1; ci != it->end(); ++ci)
      psize = ci->size += psize;
  }
  int max_C = cubes[0].size();
  vector<cub> m(max_C + 1), pm(max_C + 1);
  for (int i = 0; i < max_C; ++i)
    for (vector<vector<cub> >::iterator j = cubes.begin(); j != cubes.end();
         ++j) {
      if (j->size() <= i) break;
      if ((*j)[i].size >= m[i + 1].size) {
        pm[i + 1] = m[i + 1];
        m[i + 1].size = (*j)[i].size;
        m[i + 1].nom = j - cubes.begin();
      } else if ((*j)[i].size > pm[i + 1].size) {
        pm[i + 1].size = (*j)[i].size;
        pm[i + 1].nom = j - cubes.begin();
      }
    }
  int in_m, in_pm;
  bool if_pm;
  long long ZEBRA = 0;
  for (int i = max_C; i >= 1; --i) {
    if (m[i].nom != m[i - 1].nom)
      if (m[i].size + m[i - 1].size > ZEBRA) {
        ZEBRA = m[i].size + m[i - 1].size;
        in_m = i;
        in_pm = i - 1;
        if_pm = 0;
      }
    if (m[i].nom != pm[i - 1].nom)
      if (m[i].size + pm[i - 1].size > ZEBRA) {
        ZEBRA = m[i].size + pm[i - 1].size;
        in_m = i;
        in_pm = i - 1;
        if_pm = 1;
      }
    if (m[i].nom != pm[i].nom)
      if (m[i].size + pm[i].size > ZEBRA) {
        ZEBRA = m[i].size + pm[i].size;
        in_m = i;
        in_pm = i;
        if_pm = 1;
      }
    if (m[i - 1].nom != pm[i].nom)
      if (m[i - 1].size + pm[i].size > ZEBRA) {
        ZEBRA = m[i - 1].size + pm[i].size;
        in_m = i - 1;
        in_pm = i;
        if_pm = 1;
      }
  }
  cout << ZEBRA << "\n" << in_pm + in_m << "\n";
  int colorA = m[in_m].nom, colorB;
  if (if_pm)
    colorB = pm[in_pm].nom;
  else
    colorB = m[in_pm].nom;
  if (in_m < in_pm) {
    swap(in_m, in_pm);
    swap(colorA, colorB);
  }
  int ina = 0, inb = 0;
  if (in_m > in_pm) {
    cout << cubes[colorA][0].nom << ' ';
    ++ina;
  }
  for (int i = 0; i < in_pm; ++i)
    cout << cubes[colorB][inb++].nom << ' ' << cubes[colorA][ina++].nom << ' ';
  return 0;
}
