#include <bits/stdc++.h>
using namespace std;
const int maxn = 2100;
struct lyh {
  int x, y;
  long long cost;
} line[maxn * maxn], con[maxn];
long long tot, n, c[maxn], k[maxn], x[maxn], y[maxn], father[maxn], b[maxn],
    t1 = 0, t2 = 0, ans = 0;
bool cmp(lyh a, lyh b) {
  if (a.cost < b.cost)
    return (true);
  else
    return (false);
}
int find_(int x) {
  if (x == father[x]) return x;
  father[x] = find_(father[x]);
  return father[x];
}
int main() {
  scanf("%lld", &n);
  for (int i = 1; i <= n; ++i) scanf("%lld%lld", &x[i], &y[i]);
  for (int i = 1; i <= n; ++i) scanf("%lld", &c[i]);
  for (int i = 1; i <= n; ++i) scanf("%lld", &k[i]);
  for (int i = 1; i <= n + 1; ++i) father[i] = i;
  tot = 0;
  for (int i = 1; i <= n; ++i) {
    line[++tot].x = i, line[tot].y = n + 1, line[tot].cost = c[i];
    for (int j = i + 1; j <= n; ++j) {
      line[++tot].x = i, line[tot].y = j,
      line[tot].cost = (abs(x[i] - x[j]) + abs(y[i] - y[j])) * (k[i] + k[j]);
    }
  }
  sort(line + 1, line + tot + 1, cmp);
  for (int i = 1; i <= tot; ++i) {
    int xx, yy;
    xx = find_(line[i].x);
    yy = find_(line[i].y);
    if (xx == yy) continue;
    father[xx] = yy;
    if (line[i].x == n + 1) {
      b[++t1] = line[i].y;
    } else if (line[i].y == n + 1) {
      b[++t1] = line[i].x;
    } else {
      con[++t2].x = line[i].x;
      con[t2].y = line[i].y;
    }
    ans += line[i].cost;
  }
  printf("%lld\n", ans);
  printf("%lld\n", t1);
  for (int i = 1; i < t1; ++i) printf("%lld ", b[i]);
  printf("%lld\n", b[t1]);
  printf("%lld\n", t2);
  for (int i = 1; i <= t2; ++i) printf("%d %d\n", con[i].x, con[i].y);
  return 0;
}
