#include <bits/stdc++.h>
using namespace std;
struct node {
  long long x, y;
};
long long dp[1 << 24], dist[26][26];
int path[1 << 24], n;
int set_bit(int n, int pos) { return n = n | (1 << pos); }
int reset_bit(int n, int pos) { return n = n & (~(1 << pos)); }
bool check_bit(int n, int pos) { return (bool)(n & (1 << pos)); }
long long calc_dist(long long x1, long long y1, long long x2, long long y2) {
  return (((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)));
}
long long solve(int mask) {
  if (mask == ((1 << n) - 1))
    return 0;
  else if (dp[mask] != -1)
    return dp[mask];
  long long res = 0, ans = 0;
  int i, j, temp;
  for (i = 0; i < n; i++) {
    if (check_bit(mask, i) == false) break;
  }
  temp = set_bit(mask, i);
  ans = (2 * dist[n][i]) + solve(temp);
  path[mask] = temp;
  for (j = (i + 1); j < n; j++) {
    if (check_bit(mask, j) == false) {
      res = ((dist[n][i] + dist[n][j]) + dist[i][j]) + solve(set_bit(temp, j));
      if (ans >= res) {
        ans = res;
        path[mask] = set_bit(temp, j);
      }
    }
  }
  return dp[mask] = ans;
}
void print(int mask) {
  if (mask == ((1 << n) - 1)) return;
  int temp;
  vector<int> v;
  temp = path[mask];
  for (int i = 0; i < n; i++) {
    if (check_bit(mask, i) == false && check_bit(temp, i)) {
      v.push_back(i);
    }
  }
  if (v.size() == 1)
    printf(" %d 0", (v[0] + 1));
  else
    printf(" %d %d 0", (v[0] + 1), (v[1] + 1));
  print(temp);
}
int main() {
  long long x, y;
  int i, j;
  scanf("%lld %lld %d", &x, &y, &n);
  node a[n];
  for (i = 0; i < n; i++) {
    scanf("%lld %lld", &a[i].x, &a[i].y);
    dist[n][i] = calc_dist(x, y, a[i].x, a[i].y);
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      dist[i][j] = calc_dist(a[i].x, a[i].y, a[j].x, a[j].y);
    }
  }
  memset(dp, -1, sizeof(dp));
  printf("%lld\n", solve(0));
  printf("0");
  print(0);
  puts("");
  return 0;
}
