#include <bits/stdc++.h>
using namespace std;
const int N = 2020;
long long n, x[N], y[N], c[N], k[N], par[N], on[N], ans;
vector<pair<long long, pair<long long, long long> > > edges;
vector<long long> ans1;
vector<pair<long long, long long> > ans2;
long long get(long long x) { return par[x] == x ? x : par[x] = get(par[x]); }
void mrg(long long x, long long y) {
  x = get(x);
  y = get(y);
  if (x == y) return;
  if (rand() & 1) swap(x, y);
  par[x] = y;
  on[y] = on[y] | on[x];
}
long long inline dist(long long i, long long j) {
  return (abs(x[i] - x[j]) + abs(y[i] - y[j])) * (k[i] + k[j]);
}
void mst() {
  sort(edges.begin(), edges.end());
  for (auto x : edges) {
    long long val = x.first;
    long long u = x.second.first;
    long long v = x.second.second;
    if (u == v) {
      u = get(u);
      if (on[u]) continue;
      ans += val;
      ans1.push_back(v);
      on[u] = 1;
      continue;
    }
    u = get(u);
    v = get(v);
    if (u == v || (on[u] && on[v])) continue;
    mrg(u, v);
    ans += val;
    ans2.push_back({x.second.first, x.second.second});
  }
}
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; i++) par[i] = i;
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) edges.push_back({dist(i, j), {i, j}});
  for (int i = 1; i <= n; i++) edges.push_back({c[i], {i, i}});
  mst();
  printf("%lld\n%d\n", ans, (int)(ans1.size()));
  for (auto x : ans1) printf("%lld ", x);
  printf("\n");
  printf("%d\n", (int)(ans2.size()));
  for (auto x : ans2) printf("%lld %lld\n", x.first, x.second);
}
