#include <bits/stdc++.h>
using namespace std;
template <int M, template <typename> class F = greater>
struct TupleCompare {
  template <typename T>
  bool operator()(T const& t1, T const& t2) {
    return F<typename tuple_element<M, T>::type>()(std::get<M>(t1),
                                                   std::get<M>(t2));
  }
};
class dict {
  map<unsigned long long,
      vector<tuple<unsigned long long, unsigned long long> > >
      indexes;
  int index = 0;

 public:
  void add_box(unsigned long long, unsigned long long, unsigned long long);
  void solve();
  void print();

 private:
  void sort_map();
  void sum_up();
  void prune(int);
};
void dict::add_box(unsigned long long color, unsigned long long size,
                   unsigned long long ind) {
  indexes[color].push_back(
      tuple<unsigned long long, unsigned long long>(size, ind));
}
void dict::sort_map() {
  for (auto& box : indexes) {
    sort(begin(box.second), end(box.second), TupleCompare<0>());
  }
}
void dict::print() {
  for (auto& box : indexes) {
    for (int i = 0; i < box.second.size(); i++)
      cout << get<0>(box.second[i]) << " ";
    cout << endl;
  }
}
void dict::sum_up() {
  for (auto& box : indexes)
    for (int i = 1; i < box.second.size(); i++)
      get<0>(box.second[i]) += get<0>(box.second[i - 1]);
}
void dict::prune(int size) {
  std::map<unsigned long long,
           vector<tuple<unsigned long long, unsigned long long> > >::iterator
      gmax1 = indexes.end();
  std::map<unsigned long long,
           vector<tuple<unsigned long long, unsigned long long> > >::iterator
      gmax2 = indexes.end();
  for (std::map<unsigned long long,
                vector<tuple<unsigned long long, unsigned long long> > >::
           iterator i = indexes.begin();
       i != indexes.end();) {
    if (i->second.size() == size) {
      if (gmax1 == indexes.end())
        gmax1 = i;
      else if (gmax2 == indexes.end()) {
        if (get<0>(i->second[size - 1]) > get<0>(gmax1->second[size - 1])) {
          gmax2 = gmax1;
          gmax1 = i;
        } else {
          gmax2 = i;
        }
      } else {
        if (get<0>(i->second[size - 1]) > get<0>(gmax1->second[size - 1])) {
          indexes.erase(gmax2);
          gmax2 = gmax1;
          gmax1 = i;
        } else if (get<0>(i->second[size - 1]) >
                   get<0>(gmax2->second[size - 1])) {
          indexes.erase(gmax2);
          gmax2 = i;
        } else {
          indexes.erase(i++);
          continue;
        }
      }
    }
    i++;
  }
}
void dict::solve() {
  sort_map();
  sum_up();
  prune(1);
  prune(2);
  prune(3);
  prune(4);
  prune(5);
  prune(6);
  prune(7);
  prune(8);
  prune(9);
  prune(10);
  std::map<unsigned long long,
           vector<tuple<unsigned long long, unsigned long long> > >::iterator
      gmin,
      gmax;
  unsigned long long height = 0;
  int nblocks = 0;
  for (std::map<unsigned long long,
                vector<tuple<unsigned long long, unsigned long long> > >::
           iterator i = indexes.begin();
       i != prev(indexes.end()); i++) {
    for (std::map<unsigned long long,
                  vector<tuple<unsigned long long, unsigned long long> > >::
             iterator j = next(i);
         j != indexes.end(); j++) {
      std::map<unsigned long long,
               vector<tuple<unsigned long long, unsigned long long> > >::
          iterator cmin,
          cmax;
      if (i->second.size() < j->second.size()) {
        cmin = i;
        cmax = j;
      } else {
        cmin = j;
        cmax = i;
      }
      int min_ind = cmin->second.size() - 1;
      unsigned long long ph =
          get<0>(cmin->second[min_ind]) + get<0>(cmax->second[min_ind]);
      int cnblocks = cmin->second.size() * 2;
      if (cmax->second.size() > cmin->second.size()) {
        ph -= get<0>(cmax->second[min_ind]);
        ph += get<0>(cmax->second[min_ind + 1]);
        cnblocks += 1;
      }
      if (ph > height) {
        height = ph;
        gmin = cmin;
        gmax = cmax;
        nblocks = cnblocks;
      }
    }
  }
  cout << height << endl;
  cout << nblocks << endl;
  for (int i = 0; i < gmin->second.size(); i++) {
    if (i > 0) cout << ' ';
    cout << get<1>(gmax->second[i]) << ' ' << get<1>(gmin->second[i]);
  }
  if (gmin->second.size() < gmax->second.size())
    cout << ' ' << get<1>(gmax->second[gmin->second.size()]);
  cout << endl;
}
int main() {
  unsigned long long n, c, s;
  dict cubes;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> c >> s;
    cubes.add_box(c, s, i);
  }
  cubes.solve();
}
