#include <bits/stdc++.h>
using namespace std;
const int MOD(1000000007);
const int INF((1 << 30) - 1);
const int MAXN(100005);
struct cube {
  int color, x, num;
} a[MAXN];
bool compare(cube i, cube j) { return i.x > j.x; }
map<int, int> b, d;
map<int, int>::iterator it;
int order[MAXN] = {0};
vector<cube> p[MAXN], collect[MAXN];
struct cc {
  int num, x;
};
vector<cc> sc;
bool compare2(cc i, cc j) { return i.x < j.x; }
long long sum[MAXN] = {0};
struct zebra {
  int color;
  long long x;
};
bool operator<(zebra i, zebra j) {
  if (i.x != j.x) return i.x > j.x;
  return i.color < j.color;
}
multiset<zebra> tower;
multiset<zebra>::iterator it2;
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &a[i].color, &a[i].x);
    a[i].num = i + 1;
    d[a[i].color] = 1;
  }
  int k = 0;
  for (it = d.begin(); it != d.end(); it++) b[it->first] = k++;
  for (int i = 0; i < n; i++) a[i].color = b[a[i].color];
  sort(a, a + n, compare);
  for (int i = 0; i < n; i++) collect[a[i].color].push_back(a[i]);
  for (int i = 0; i < k; i++) {
    cc t;
    t.num = i, t.x = collect[i].size();
    sc.push_back(t);
  }
  sort(sc.begin(), sc.end(), compare2);
  int maxorder = 0;
  for (int i = 0; i < n; i++) {
    p[order[a[i].color]++].push_back(a[i]);
    maxorder = max(maxorder, order[a[i].color]);
  }
  long long maxh = 0;
  int chk = 0, c1 = -1, c2 = -1;
  for (int i = 0; i < maxorder; i++) {
    while (chk < sc.size()) {
      if (sc[chk].x < i) {
        zebra t;
        t.color = sc[chk].num;
        t.x = sum[t.color];
        tower.erase(t);
        chk++;
      } else
        break;
    }
    for (int j = 0; j < p[i].size(); j++) {
      zebra t;
      t.color = p[i][j].color;
      t.x = sum[t.color];
      if (maxorder != 0) tower.erase(t);
      t.x += p[i][j].x;
      sum[t.color] = t.x;
      tower.insert(t);
    }
    long long tmp = 0;
    int tc1, tc2;
    it2 = tower.begin();
    if (it2 == tower.end()) continue;
    tmp += it2->x, tc1 = it2->color;
    it2++;
    if (it2 == tower.end()) continue;
    tmp += it2->x, tc2 = it2->color;
    if (tmp > maxh) {
      maxh = tmp;
      c1 = tc1;
      c2 = tc2;
    }
  }
  int f = min(collect[c1].size(), collect[c2].size()),
      l = max(collect[c1].size(), collect[c2].size());
  int numcube = f + min(l, f + 1);
  cout << maxh << endl << numcube << endl;
  if (collect[c1].size() > collect[c2].size()) {
    for (int j = 0; j < f; j++)
      printf("%d %d ", collect[c1][j].num, collect[c2][j].num);
    if (l > f) printf("%d", collect[c1][f].num);
  } else {
    for (int j = 0; j < f; j++)
      printf("%d %d ", collect[c2][j].num, collect[c1][j].num);
    if (l > f) printf("%d", collect[c2][f].num);
  }
}
