#include <bits/stdc++.h>
using namespace std;
struct cub {
  int c, h;
} nr[100100];
vector<int> axnorm;
vector<pair<int, int> > cul[100100];
struct cmp {
  bool operator()(pair<int, int> a, pair<int, int> b) {
    return (a.first > b.first);
  }
};
priority_queue<pair<long long, int> > H[100100];
int N, C;
int culoare1, culoare2, nrcub1, nrcub2;
long long solutie;
int caut(int x) {
  int p = -1, u = C, mij;
  while (u - p > 1) {
    mij = (p + u) / 2;
    if (axnorm[mij] < x)
      p = mij;
    else
      u = mij;
  }
  if (u == C || axnorm[u] != x) return -1;
  return u;
}
void prec() {
  long long sum;
  for (int i = 1; i <= C; ++i) {
    sum = 0;
    sort(cul[i].begin(), cul[i].end(), cmp());
    for (size_t j = 0; j < cul[i].size(); ++j) {
      sum = (long long)(sum + cul[i][j].first);
      H[(int)(j + 1)].push(pair<long long, int>(sum, i));
    }
  }
}
void solve() {
  sort(axnorm.begin(), axnorm.end());
  axnorm.erase(unique(axnorm.begin(), axnorm.end()), axnorm.end());
  C = (int)axnorm.size();
  int i, cc, cc1;
  long long s, s1;
  for (i = 1; i <= N; ++i)
    cul[caut(nr[i].c) + 1].push_back(pair<int, int>(nr[i].h, i));
  prec();
  for (i = 1; i <= N; ++i) {
    if (H[i].size() < 2) break;
    s = H[i].top().first;
    cc = H[i].top().second;
    H[i].pop();
    if (solutie < s + H[i].top().first) {
      solutie = s + H[i].top().first;
      culoare1 = cc;
      culoare2 = H[i].top().second;
      nrcub1 = nrcub2 = i;
    }
    H[i].push(pair<long long, int>(s, cc));
  }
  for (i = 2; i <= N; ++i) {
    if (!H[i].size()) break;
    s = H[i].top().first;
    cc = H[i].top().second;
    H[i].pop();
    s1 = H[i - 1].top().first;
    cc1 = H[i - 1].top().second;
    H[i - 1].pop();
    if (cc == cc1) {
      if (H[i].size() > 0) {
        if (solutie < s1 + H[i].top().first) {
          solutie = s1 + H[i].top().first;
          culoare1 = H[i].top().first;
          culoare2 = cc1;
          nrcub1 = i;
          nrcub2 = i - 1;
        }
      }
      if (H[i - 1].size() > 0) {
        if (solutie < s + H[i - 1].top().first) {
          solutie = s + H[i - 1].top().first;
          culoare1 = cc1;
          culoare2 = H[i - 1].top().second;
          nrcub1 = i;
          nrcub2 = i - 1;
        }
      }
    } else {
      if (solutie < s + s1) {
        solutie = s + s1;
        culoare1 = cc;
        culoare2 = cc1;
        nrcub1 = i;
        nrcub2 = i - 1;
      }
    }
    H[i].push(pair<long long, int>(s, cc));
    H[i - 1].push(pair<long long, int>(s1, cc1));
  }
}
void afis() {
  size_t x, y;
  x = y = 0;
  cout << solutie << '\n';
  cout << nrcub1 + nrcub2 << '\n';
  while (nrcub1 || nrcub2) {
    if (nrcub1 > nrcub2) {
      cout << cul[culoare1][x].second << ' ';
      ++x;
      --nrcub1;
    } else {
      cout << cul[culoare2][y].second << ' ';
      ++y;
      --nrcub2;
    }
  }
}
int main() {
  int i;
  scanf("%d", &N);
  for (i = 1; i <= N; ++i) {
    scanf("%d%d", &nr[i].c, &nr[i].h);
    axnorm.push_back(nr[i].c);
  }
  solve();
  afis();
  return 0;
}
