#include <bits/stdc++.h>
using namespace std;
ifstream fin ("munte2.in");
ofstream fout ("munte2.out");
#define MAX_N 103
#define MAX_K 33
const double INF = 1000000000.0;
double dp [MAX_N][MAX_K];
int g [MAX_N][MAX_K];
int n, K, l;
int valid [MAX_N][MAX_N];
double dist [MAX_N][MAX_N];
struct Varf {
int x, y;
}p [MAX_N];
bool Test (int i, int j){
int d1, d2, H, h, hh, x;
for (int k = i + 1; k < j; k++)
{
d1 = p [k].x - p [i].x, d2 = p [j].x - p [k].x;
H = p [j].y, h = p [i].y, hh = p [k].y;
x = (d1 + d2) * (h + H) - ((d1 * (hh + h) + d2 * (hh + H)));
if (x <= 0) return 0;
}
return 1;
}
double Dist (int i, int j){
return sqrt ((double)((p [j].x - p [i].x) * (p [j].x - p [i].x) + (p [j].y - p [i].y) * (p [j].y - p [i].y)));
}
void Rec (int i, int j){
if (!j)return;
Rec (g [i][j], j - 1);
fout << i << " ";
}
void Afisare (){
fout << dp [n][K] << '\n';
Rec (n, K);
}
int main (){
fin >> n >> K >> l;
for (int i = 1; i <= n; i ++)
fin >> p [i].x >> p [i].y;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= K; j ++)
dp [i][j] = INF;
for (int i = 2; i <= n; i ++){
for (int j = 1; j < i; j ++){
dist [i][j] = Dist (i, j);
if (dist [i][j] > l)continue;
valid [i][j] = Test (j, i);
}
}dp [1][1] = .0;
for (int i = 2; i <= n; i ++){
for (int j = 1; j < i; j ++){
if (valid [i][j] == 1){
for (int p = 1; p < K; p ++){
if (dp [j][p] + dist [i][j] < dp [i][p + 1]){
dp [i][p + 1] = dp [j][p] + dist [i][j];
g [i][p + 1] = j;
}
}
}
}
}
Afisare ();
return 0;
}