#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 100010;
struct node {
  int c;
  int s;
  int rank;
  node() {}
  node(int _c, int _s, int _r) : c(_c), s(_s), rank(_r) {}
  bool operator<(const node& rhs) const {
    if (c == rhs.c) return s > rhs.s;
    return c < rhs.c;
  }
} a[maxn];
struct seg {
  int n;
  int st;
  bool operator<(const seg& rhs) const { return n > rhs.n; }
} segs[maxn];
int seglen;
long long maxK[maxn];
int maxP[maxn];
int len1;
int len2;
int idx1;
int idx2;
int main(int argc, char* argv[]) {
  cin >> n;
  int i;
  for (i = 0; i < n; ++i) {
    cin >> a[i].c >> a[i].s;
    a[i].rank = i + 1;
  }
  sort(a, a + n);
  for (i = 0; i < n; ++i) {
    if (i && a[i].c == a[i - 1].c) continue;
    segs[seglen].st = i;
    int j;
    for (j = i + 1; j < n && a[j].c == a[j - 1].c; ++j)
      ;
    segs[seglen].n = j - i;
    ++seglen;
  }
  sort(segs, segs + seglen);
  long long S = 0;
  for (i = 0; i < seglen; ++i) {
    int j;
    long long ret = 0;
    int len = 0;
    for (j = segs[i].st; j < segs[i].st + segs[i].n; ++j) {
      ret += a[j].s;
      ++len;
      for (int k = len; k < len + 2; ++k) {
        if (maxK[k] && ret + maxK[k] > S) {
          S = ret + maxK[k];
          idx1 = segs[i].st;
          len1 = len;
          idx2 = segs[maxP[k]].st;
          len2 = k;
        }
      }
      if (ret > maxK[len]) {
        maxK[len] = ret;
        maxP[len] = i;
      }
    }
  }
  cout << S << endl;
  cout << len1 + len2 << endl;
  int j;
  for (i = idx2, j = idx1; i < idx2 + len2; ++i) {
    if (i - idx2) cout << " ";
    cout << a[i].rank;
    if (j < idx1 + len1) {
      cout << " " << a[j].rank;
      j++;
    }
  }
  if (len1 + len2) cout << endl;
  return 0;
}
