#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 25;
int getbit(int x) {
  int res = 0;
  while (x) {
    x >>= 1;
    res++;
  }
  return res;
}
int n;
struct node {
  int x, y;
} item[maxn];
int dis[maxn][maxn];
int getdis(const node &a, const node &b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
int once_take[maxn * maxn];
int cnt;
void init() {
  for (int i = 1; i <= n; i++) {
    dis[i][i] = 0;
    for (int j = 0; j < i; j++) {
      dis[j][i] = dis[i][j] = getdis(item[i], item[j]);
    }
  }
}
int dp[1 << (maxn - 1) | 1];
int pre[1 << (maxn - 1) | 1];
int main() {
  scanf("%d%d", &item[0].x, &item[0].y);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d%d", &item[i].x, &item[i].y);
  init();
  memset(dp, 0x3f, sizeof(dp));
  dp[0] = 0;
  for (int mask = 1; mask < 1 << n; mask++) {
    int i = getbit(mask);
    int temp = mask;
    while (temp) {
      int j = getbit(temp);
      temp -= (1 << (j - 1));
      if (dp[mask] > dp[mask ^ ((1 << i - 1) | (1 << j - 1))] + dis[0][i] +
                         dis[i][j] + dis[j][0]) {
        dp[mask] = dp[mask ^ ((1 << i - 1) | (1 << j - 1))] + dis[0][i] +
                   dis[i][j] + dis[j][0];
        pre[mask] = mask ^ ((1 << i - 1) | (1 << j - 1));
      }
    }
  }
  printf("%d\n", dp[(1 << n) - 1]);
  int dpend = (1 << n) - 1;
  while (dpend) {
    printf("0 ");
    int temp1 = dpend ^ pre[dpend];
    int temp2 = temp1 & -temp1;
    temp1 -= temp2;
    printf("%d ", getbit(temp2));
    if (temp1) printf("%d ", getbit(temp1));
    dpend = pre[dpend];
  }
  printf("0\n");
  return 0;
}
