#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:64000000")
using namespace std;
const long long inf = (long long)1e17;
long long ans = 0, c1 = 0, c2 = 0, cnt1 = 0, cnt2 = 0;
long long b[100005][2][2] = {}, mx, n, cnt;
long long max(long long a, long long b) {
  if (a > b) return a;
  return b;
}
void f(long long c, long long cnt) {
  long long cu = b[cnt][c][0], cc = b[cnt][c][1];
  if (b[cnt][c ^ 1][1] != cc) {
    if (ans < cu + b[cnt][c ^ 1][0]) {
      ans = cu + b[cnt][c ^ 1][0];
      cnt1 = cnt2 = cnt;
      c1 = c;
      c2 = c ^ 1;
    }
  }
  if (cnt > 1) {
    if (b[cnt - 1][c][1] != cc) {
      if (b[cnt - 1][c][0] + cu > ans) {
        ans = b[cnt - 1][c][0] + cu;
        cnt1 = cnt;
        cnt2 = cnt - 1;
        c1 = c2 = c;
      }
    }
    if (b[cnt - 1][c ^ 1][1] != cc) {
      if (b[cnt - 1][c ^ 1][0] + cu > ans) {
        ans = b[cnt - 1][c ^ 1][0] + cu;
        cnt1 = cnt;
        cnt2 = cnt - 1;
        c1 = c;
        c2 = c ^ 1;
      }
    }
  }
  if (b[cnt + 1][c][1] != cc) {
    if (b[cnt + 1][c][0] + cu > ans) {
      ans = b[cnt + 1][c][0] + cu;
      cnt1 = cnt;
      cnt2 = cnt + 1;
      c1 = c2 = c;
    }
  }
  if (b[cnt + 1][c ^ 1][1] != cc) {
    if (b[cnt + 1][c ^ 1][0] + cu > ans) {
      ans = b[cnt + 1][c ^ 1][0] + cu;
      cnt1 = cnt;
      cnt2 = cnt + 1;
      c1 = c;
      c2 = c ^ 1;
    }
  }
}
struct cube {
  long long c, w, num;
};
struct cmp {
  bool operator()(const cube& a, const cube& b) {
    return (a.c < b.c || (a.c == b.c && a.w > b.w));
  }
};
int main() {
  cin >> n;
  for (int i = 0; i < 100005; ++i)
    for (int j = 0; j < 2; ++j)
      for (int k = 0; k < 2; ++k) b[i][j][k] = -inf;
  vector<cube> a(n);
  for (int i = 0; i < n; ++i) {
    cin >> a[i].c >> a[i].w;
    a[i].num = i;
  }
  sort(a.begin(), a.end(), cmp());
  for (int i = 0, j; i < n; ++i) {
    for (j = i; j < n && a[j].c == a[i].c; ++j)
      ;
    mx = 0, cnt = 0;
    for (int k = i; k < j; ++k) {
      mx += a[k].w;
      ++cnt;
      if (mx >= b[cnt][0][0]) {
        b[cnt][1][0] = b[cnt][0][0];
        b[cnt][1][1] = b[cnt][0][1];
        b[cnt][0][0] = mx;
        b[cnt][0][1] = a[i].c;
      } else if (mx > b[cnt][1][0]) {
        b[cnt][1][0] = mx;
        b[cnt][1][1] = a[i].c;
      }
    }
    i = j - 1;
  }
  for (int i = 1; i <= n; ++i) {
    f(0, i);
    f(1, i);
  }
  cout << ans << '\n' << cnt1 + cnt2 << '\n';
  vector<int> help1, help2;
  for (int i = 0; i < n; ++i)
    if (a[i].c == b[cnt1][c1][1] && cnt1 > help1.size())
      help1.push_back(a[i].num);
  for (int i = 0; i < n; ++i)
    if (a[i].c == b[cnt2][c2][1] && cnt2 > help2.size())
      help2.push_back(a[i].num);
  if (cnt2 > cnt1) swap(help1, help2);
  while (help2.size() != 0) {
    cout << help1.back() + 1 << ' ' << help2.back() + 1 << ' ';
    help1.pop_back();
    help2.pop_back();
  }
  if (help1.size() != 0)
    cout << help1.back() + 1 << '\n';
  else
    cout << '\n';
}
