#include <iostream>
#include <algorithm>
#include <vector>
#include <climits>
using namespace std;
//Структура для представления одного отрезка
struct Line {
int price;
int length;
};
//Функция сортировщик по цене в порядке возрастания
bool comparator_price (Line i, Line j) {
return i.price < j.price;
}
int main() {
int n, price, length, cheapest = INT_MAX;
cin >> n;
Line lines_by_price[n];
for (int i = 0; i < n; i++) {
Line l;
cin >> length >> price;
l.price = price;
l.length = length;
lines_by_price[i] = l;
}
//Сортируем все отрезки по цене, чтобы была возможность "отсечь"
//слишком дорогие отрезки, когда цена одного(или двух) будет
//больше текущей минимальной
sort(&lines_by_price[0], &lines_by_price[n], comparator_price);
for (int i = 0; i < n; i++) {
Line first_side = lines_by_price[i];
if (first_side.price > cheapest) break;
vector<Line> sides = {};
//Перебираем все возможные тройки отрезков, отсекая
//слишком дорогие, основываясь на сортировке по цене
//и текущей минимальной цене
for (int j = 0; j < n; j++) {
if (lines_by_price[j].price != first_side.price && lines_by_price[j].length <= first_side.length) {
sides.push_back(lines_by_price[j]);
Line second_side = lines_by_price[j];
if (first_side.price + second_side.price > cheapest) break;
for (auto third_side: sides) {
if ((third_side.length != second_side.length && third_side.price != second_side.price)
&& first_side.length < second_side.length + third_side.length
&& second_side.length < first_side.length + third_side.length
&& third_side.length < second_side.length + first_side.length) {
if (first_side.price + second_side.price + third_side.price < cheapest) {
cheapest = first_side.price + second_side.price + third_side.price;
}
break;
}
}
}
}
}
//Если ни одна тройка отрезков не подошла, значит составить
//треугольник невозможно - выводим "-1"
if (cheapest == INT_MAX) cheapest = -1;
cout << cheapest;
return 0;
}