#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
int n;
pair<int, long long> inp[MAXN];
map<int, int> colorMap;
int nColors;
vector<vector<long long> > vec;
vector<vector<int> > ind;
int maxSize;
bool my_comp(const int& i, const int& j) {
  if (inp[i].second > inp[j].second) return true;
  return false;
}
int main() {
  cin >> n;
  nColors = 0;
  for (int i = 0; i < n; ++i) {
    int col;
    long long siz;
    cin >> col >> siz;
    if (!colorMap.count(col)) {
      colorMap[col] = nColors;
      ++nColors;
    }
    inp[i].first = colorMap[col];
    inp[i].second = siz;
  }
  vec.resize(nColors);
  ind.resize(nColors);
  for (int i = 0; i < nColors; ++i) {
    vec[i].clear();
    ind[i].clear();
  }
  for (int i = 0; i < n; ++i) {
    vec[inp[i].first].push_back(inp[i].second);
    ind[inp[i].first].push_back(i);
  }
  maxSize = 0;
  for (int i = 0; i < nColors; ++i) {
    sort(ind[i].begin(), ind[i].end(), my_comp);
    sort(vec[i].begin(), vec[i].end());
    if ((int)vec[i].size() > maxSize) maxSize = vec[i].size();
  }
  vector<pair<long long, int> > best(maxSize + 1);
  vector<pair<long long, int> > second_best(maxSize + 1);
  for (int i = 1; i <= maxSize; ++i) {
    best[i] = pair<long long, int>(0, 0);
    second_best[i] = pair<long long, int>(0, 0);
  }
  for (int col = 0; col < nColors; ++col) {
    long long sum = 0;
    int siz = 0;
    for (int i = (int)vec[col].size() - 1; i >= 0; --i) {
      ++siz;
      sum += vec[col][i];
      if (sum > best[siz].first) {
        second_best[siz] = best[siz];
        best[siz] = pair<long long, int>(sum, col);
      } else if (sum > second_best[siz].first) {
        second_best[siz] = pair<long long, int>(sum, col);
      }
    }
  }
  pair<int, int> ret;
  long long retScore = 0;
  for (int siz = 1; siz <= maxSize; ++siz) {
    if (best[siz].first == 0) continue;
    if (second_best[siz].first != 0) {
      long long tmp = best[siz].first + second_best[siz].first;
      if (tmp > retScore) {
        retScore = tmp;
        ret = pair<int, int>(best[siz].second, second_best[siz].second);
      }
    }
    if (siz < maxSize && best[siz + 1].first != 0 &&
        best[siz + 1].second != best[siz].second) {
      long long tmp = best[siz].first + best[siz + 1].first;
      if (tmp > retScore) {
        retScore = tmp;
        ret = pair<int, int>(best[siz].second, best[siz + 1].second);
      }
    }
    if (second_best[siz].first != 0 && siz < maxSize &&
        best[siz + 1].first != 0 &&
        second_best[siz].second != best[siz + 1].second) {
      long long tmp = second_best[siz].first + best[siz + 1].first;
      if (tmp > retScore) {
        retScore = tmp;
        ret = pair<int, int>(second_best[siz].second, best[siz + 1].second);
      }
    }
    if (siz < maxSize && second_best[siz + 1].first != 0 &&
        second_best[siz + 1].second != best[siz].second) {
      long long tmp = best[siz].first + second_best[siz + 1].first;
      if (tmp > retScore) {
        retScore = tmp;
        ret = pair<int, int>(best[siz].second, second_best[siz + 1].second);
      }
    }
  }
  cout << retScore << endl;
  int a = ret.first;
  int b = ret.second;
  if (vec[a].size() < vec[b].size()) {
    swap(a, b);
  }
  int siz = vec[b].size();
  int toprint = 2 * siz;
  if (vec[a].size() > vec[b].size()) ++toprint;
  cout << toprint << endl;
  for (int i = 0; i < siz; ++i) {
    cout << ind[a][i] + 1 << " " << ind[b][i] + 1;
    if (i < siz - 1) cout << " ";
  }
  if (vec[a].size() > vec[b].size()) {
    cout << " " << ind[a][siz] + 1;
  }
  cout << endl;
  return 0;
}
