#include <bits/stdc++.h>
using namespace std;
struct Point {
  long long x, y, w, k, id;
  bool operator<(const Point &t) { return w < t.w; }
} p[100005];
long long fa[100005], dp[100005], now, ans = 0;
struct Edge {
  long long x, y, w;
  bool operator<(const Edge &t) const { return w < t.w; }
} e[2000005];
long long findd(long long x) {
  if (x == fa[x]) {
    return x;
  } else {
    return fa[x] = findd(fa[x]);
  }
}
long long add(long long x, long long y) {
  if (dp[x] < dp[y]) {
    fa[y] = x;
  } else {
    fa[x] = y;
  }
}
vector<long long> v;
vector<pair<long long, long long> > vv;
int main() {
  long long n, cnt = 0;
  scanf("%lld", &n);
  for (long long i = 1; i <= n; i++) {
    scanf("%lld%lld", &p[i].x, &p[i].y);
    p[i].id = i;
  }
  for (long long i = 1; i <= n; i++) scanf("%lld", &p[i].w);
  for (long long i = 1; i <= n; i++) scanf("%lld", &p[i].k);
  for (long long i = 1; i <= n; i++) {
    fa[i] = i;
    dp[i] = p[i].w;
    ans += dp[i];
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = i + 1; j <= n; j++) {
      e[++cnt].x = i;
      e[cnt].y = j;
      e[cnt].w =
          (p[i].k + p[j].k) * (abs(p[i].x - p[j].x) + abs(p[i].y - p[j].y));
    }
  }
  sort(e + 1, e + cnt + 1);
  for (long long i = 1; i <= cnt; i++) {
    long long fx = findd(e[i].x);
    long long fy = findd(e[i].y);
    if (fx == fy) continue;
    if (e[i].w < max(dp[fx], dp[fy])) {
      ans -= max(dp[fx], dp[fy]);
      ans += e[i].w;
      vv.push_back(pair<long long, long long>(e[i].x, e[i].y));
      add(fx, fy);
    }
  }
  for (long long i = 1; i <= n; i++) {
    if (findd(i) == i) v.push_back(i);
  }
  printf("%lld\n", ans);
  printf("%lld\n", (long long)v.size());
  for (auto x : v) printf("%lld ", x);
  puts("");
  printf("%lld\n", (long long)vv.size());
  for (auto now : vv) printf("%lld %lld\n", now.first, now.second);
  puts("");
}
