#include <bits/stdc++.h>
using namespace std;
int x, y, n;
int xs[30], ys[30];
int mem[16777227];
int ALL;
int dt[30][30];
int calc(int mask) {
  if (mask == ALL) return 0;
  int& res = mem[mask];
  if (res != -1) return res;
  res = ((int)1e9);
  int f = -1;
  for (int i = 0; i < n; ++i) {
    if ((mask >> i) & 1) continue;
    if (f == -1) {
      f = i;
      res = min(res, calc(mask | (1 << i)) + 2 * dt[n][i]);
    } else {
      int d = dt[n][i] + dt[n][f] + dt[i][f];
      res = min(res, calc(mask | (1 << i) | (1 << f)) + d);
    }
  }
  return res;
}
int sz;
int sol[50];
void build(int mask) {
  if (mask == ALL) return;
  int& res = mem[mask];
  for (int i = 0; i < n; ++i) {
    if ((mask >> i) & 1) continue;
    if (res == calc(mask | (1 << i)) + 2 * dt[n][i]) {
      printf(" %d 0", i + 1);
      build(mask | (1 << i));
      return;
    }
    for (int j = 0; j < n; ++j) {
      if (i == j) continue;
      if ((mask >> j) & 1) continue;
      int d = dt[n][i] + dt[n][j] + dt[i][j];
      if (res == calc(mask | (1 << i) | (1 << j)) + d) {
        printf(" %d %d 0", i + 1, j + 1);
        build(mask | (1 << i) | (1 << j));
        return;
      }
    }
  }
  return;
}
inline int dist(int x1, int y1, int x2, int y2) {
  return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main() {
  while (scanf("%d%d", &x, &y) != -1) {
    scanf("%d", &n);
    ALL = (1 << n) - 1;
    for (int i = 0; i < n; ++i) {
      scanf("%d%d", xs + i, ys + i);
      dt[i][n] = dt[n][i] = dist(xs[i], ys[i], x, y);
    }
    for (int i = 0; i < n; ++i) {
      for (int j = i + 1; j < n; ++j) {
        dt[i][j] = dt[j][i] = dist(xs[i], ys[i], xs[j], ys[j]);
      }
    }
    memset(mem, -1, sizeof mem);
    int res = calc(0);
    printf("%d\n0", res);
    build(0);
    printf("\n");
  }
  return 0;
}
