#include <bits/stdc++.h>
using namespace std;
vector<long long> lista[100100], lista2[100100];
long long size[100100];
map<long long, long long> memo;
bool compare(long long a, long long b) { return size[a] < size[b]; }
typedef struct {
  long long idx;
  long long tam;
} Ordenar;
bool compare2(Ordenar a, Ordenar b) { return a.tam < b.tam; }
Ordenar ord[100100];
int main() {
  long long n, color, id = 0;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    cin >> color >> size[i];
    if (memo.find(color) == memo.end()) memo[color] = id++;
    lista[memo[color]].push_back(i);
  }
  for (long long i = 0; i < id; i++) {
    sort(lista[i].begin(), lista[i].end(), compare);
    reverse(lista[i].begin(), lista[i].end());
    ord[i].idx = i;
    ord[i].tam = lista[i].size();
    lista2[i].push_back(size[lista[i][0]]);
    for (long long j = 1; j < lista[i].size(); j++) {
      lista2[i].push_back(size[lista[i][j]] + lista2[i][j - 1]);
    }
  }
  sort(ord, ord + 100100, compare2);
  long long i = 0;
  while (ord[i].tam == 0) {
    i++;
  }
  long long saida = 0;
  Ordenar bst;
  long long left, right;
  bst.idx = ord[100100 - 1].idx;
  bst.tam = ord[100100 - 1].tam;
  int p = i;
  for (i = 100100 - 2; i >= p; i--) {
    long long aqui =
        lista2[bst.idx][ord[i].tam - 1] + lista2[ord[i].idx][ord[i].tam - 1];
    if (aqui > saida) {
      saida = aqui;
      left = bst.idx;
      right = ord[i].idx;
    }
    if (lista2[ord[i].idx].size() < bst.tam) {
      aqui = lista2[bst.idx][ord[i].tam] + lista2[ord[i].idx][ord[i].tam - 1];
      if (aqui > saida) {
        saida = aqui;
        left = bst.idx;
        right = ord[i].idx;
      }
    }
    if (lista2[ord[i].idx][ord[i].tam - 1] > lista2[bst.idx][ord[i].tam - 1]) {
      bst.idx = ord[i].idx;
      bst.tam = ord[i].tam;
    }
  }
  vector<long long> fin, a, b;
  if (lista[left].size() < lista[right].size()) {
    a = lista[left];
    b = lista[right];
  } else {
    a = lista[right];
    b = lista[left];
  }
  long long mi = min(a.size(), b.size());
  for (long long j = 0; j < mi; j++) {
    fin.push_back(b[j]);
    saida += size[b[j]];
    fin.push_back(a[j]);
    saida += size[a[j]];
  }
  long long u = 2 * mi;
  if (b.size() > a.size()) {
    fin.push_back(b[mi]);
    saida += size[b[mi]];
    u++;
  }
  cout << saida / 2 << endl;
  cout << u << endl;
  for (long long j = 0; j < fin.size(); j++) {
    if (j != 0) cout << " ";
    cout << fin[j] + 1;
  }
  cout << endl;
  return 0;
}
