#include <iostream>
#include <vector>
#include <algorithm>
using Benzinkutak = std::vector<std::pair<int, int>>;
void beolvas(std::istream &in, Benzinkutak &b, int &k) {
int n;
in >> n >> k;
b.resize(n);
for (auto i = 0; i < n; i++) {
in >> b[i].first >> b[i].second;
}
}
void feldolgoz(const Benzinkutak &b, int k) {
const auto n = static_cast<int>(b.size());
std::vector<std::pair<int, int>> dp(n + 1);
dp[0] = { -1, 0 };
for (auto i = 0; i < n; i++) {
const auto elso_tiltott = std::upper_bound(b.begin(), b.end(), b[i].first - k, [](int tav, const auto &kut) {
return tav < kut.first;
}) - b.begin();
const auto telepit_haszon = b[i].second + dp[elso_tiltott].second;
const auto nem_telepit_haszon = dp[i].second;
if (telepit_haszon < nem_telepit_haszon) {
dp[i + 1] = { -1, nem_telepit_haszon };
} else {
dp[i + 1] = { static_cast<int>(elso_tiltott), telepit_haszon };
}
}
std::vector<int> telepitett_indexek;
auto i = n;
while (i > 0) {
if (dp[i].first >= 0) {
telepitett_indexek.push_back(i);
i = dp[i].first;
} else {
i--;
}
}
std::cout << dp[n].second << std::endl;
std::cout << telepitett_indexek.size() << ' ';
for (auto ti = telepitett_indexek.crbegin(); ti != telepitett_indexek.crend(); ++ti) {
std::cout << *ti << ' ';
}
std::cout << std::endl;
}
int main() {
Benzinkutak b;
int k;
beolvas(std::cin, b, k);
feldolgoz(b, k);
return 0;
}