#include <bits/stdc++.h>
using namespace std;
const int maxn = 2500;
struct edge {
  int u, v;
  long long w;
  edge(int a = 0, int c = 0, long long b = 0) : u(a), v(c), w(b) {}
};
struct node {
  int u, v;
};
node sum[maxn];
edge es[maxn * maxn + 100];
int n, cnt = 0, tot1, tot2;
long long xi[maxn], yi[maxn], ci[maxn], ki[maxn], tot3;
int f[maxn], ans[maxn];
bool cmp(edge e1, edge e2) { return e1.w < e2.w; }
long long dis(int i, int j) { return abs(xi[i] - xi[j]) + abs(yi[i] - yi[j]); }
int find(int x) {
  if (f[x] == x)
    return x;
  else
    return f[x] = find(f[x]);
}
void init() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%lld%lld", &xi[i], &yi[i]);
  for (int i = 1; i <= n; i++) scanf("%lld", &ci[i]);
  for (int i = 1; i <= n; i++) scanf("%lld", &ki[i]);
}
void make_graph() {
  cnt = 0;
  for (int i = 1; i <= n; i++) es[++cnt] = edge(0, i, ci[i]);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      es[++cnt] = edge(i, j, (ki[i] + ki[j]) * dis(i, j));
    }
  }
}
void krusal() {
  tot1 = 0;
  tot2 = 0;
  tot3 = 0;
  for (int i = 0; i <= n; i++) f[i] = i;
  sort(es + 1, es + cnt + 1, cmp);
  for (int i = 1; i <= cnt; i++) {
    int u1 = find(es[i].u), v1 = find(es[i].v);
    if (u1 == v1) continue;
    tot3 += es[i].w;
    if (es[i].u == 0 || es[i].v == 0) {
      tot1++;
      if (es[i].u != 0)
        ans[tot1] = es[i].u;
      else
        ans[tot1] = es[i].v;
      if (u1 < v1) swap(u1, v1);
      f[u1] = v1;
    } else {
      tot2++;
      sum[tot2].u = es[i].u;
      sum[tot2].v = es[i].v;
      if (u1 < v1) swap(u1, v1);
      f[u1] = v1;
    }
  }
}
void output() {
  printf("%lld\n", tot3);
  printf("%d\n", tot1);
  for (int i = 1; i <= tot1; i++)
    printf("%d%c", ans[i], (i == tot1) ? '\n' : ' ');
  printf("%d\n", tot2);
  for (int i = 1; i <= tot2; i++) printf("%d %d\n", sum[i].u, sum[i].v);
}
int main() {
  init();
  make_graph();
  krusal();
  output();
  return 0;
}
