#include <bits/stdc++.h>
using namespace std;
template <class _T>
inline _T sqr(const _T& x) {
  return x * x;
}
template <class _T>
inline string tostr(const _T& a) {
  ostringstream os("");
  os << a;
  return os.str();
}
const long double PI = 3.1415926535897932384626433832795;
const long double EPS = 1e-11;
struct tp {
  int x, y;
};
int n;
tp a[1024];
int d1[32];
int d2[32][32];
tp p0;
int d[1 << 24];
int pa[1 << 24];
int dist2(tp p1, tp p2) { return sqr(p1.x - p2.x) + sqr(p1.y - p2.y); }
int main() {
  cout << setiosflags(ios::fixed) << setprecision(10);
  scanf("%d%d", &p0.x, &p0.y);
  scanf("%d", &n);
  for (int i = 0; i < (int)(n); i++) {
    scanf("%d%d", &a[i].x, &a[i].y);
  }
  for (int i = 0; i < (int)(n); i++) {
    d1[i] = dist2(p0, a[i]);
    for (int j = 0; j < (int)(n); j++) {
      d2[i][j] = dist2(a[i], a[j]);
    }
  }
  memset(d, 0x3f, sizeof(d));
  d[0] = 0;
  pa[0] = -1;
  int en = (1 << n) - 1;
  for (int mask = 0; mask < (int)(en); mask++) {
    int s = 0;
    for (int i = 0; i < (int)(n); i++) {
      if (mask & (1 << i)) continue;
      s = i;
      break;
    }
    int newmask = mask | (1 << s);
    if (d[newmask] > d[mask] + 2 * d1[s]) {
      d[newmask] = d[mask] + 2 * d1[s];
      pa[newmask] = s;
    }
    for (int i = (s + 1); i <= (int)(n - 1); i++) {
      if (mask & (1 << i)) continue;
      int newmask = mask | (1 << s) | (1 << i);
      if (d[newmask] > d[mask] + d1[s] + d1[i] + d2[s][i]) {
        d[newmask] = d[mask] + d1[s] + d1[i] + d2[s][i];
        pa[newmask] = 256 + (s * 256 + i);
      }
    }
  }
  printf("%d\n", d[(1 << n) - 1]);
  int x = (1 << n) - 1;
  printf("0");
  while (x) {
    if (pa[x] > 100) {
      int v1 = (pa[x] - 256) / 256;
      int v2 = (pa[x] - 256) % 256;
      printf(" %d %d 0", v1 + 1, v2 + 1);
      x ^= 1 << v1;
      x ^= 1 << v2;
    } else {
      int v = pa[x];
      printf(" %d 0", v + 1);
      x ^= 1 << v;
    }
  }
  return 0;
}
