#include <bits/stdc++.h>
using namespace std;
long long pa[2005];
long long sz[2005];
long long get_p(int node) {
  if (pa[node] == -1)
    return node;
  else {
    int par = get_p(pa[node]);
    pa[node] = par;
    return par;
  }
}
void un(int a, int b) {
  if (sz[a] > sz[b]) swap(a, b);
  pa[a] = b;
  sz[b] += sz[a];
}
vector<pair<long long, long long> > nodes;
vector<long long> plants;
int main() {
  int n;
  cin >> n;
  sz[0] = 1;
  long long x[n + 1];
  long long y[n + 1];
  long long c[n + 1];
  long long k[n + 1];
  for (int i = 0; i < n; i++) {
    cin >> x[i + 1] >> y[i + 1];
    sz[i] = 1;
  }
  memset(pa, -1, sizeof(pa));
  for (int i = 0; i < n; i++) {
    cin >> c[i + 1];
  }
  for (int i = 0; i < n; i++) {
    cin >> k[i + 1];
  }
  vector<pair<long long, pair<long long, long long> > > v;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      v.push_back(
          {(k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j])), {i, j}});
    }
  }
  for (int i = 1; i <= n; i++) {
    v.push_back({c[i], {0, i}});
  }
  sort(v.begin(), v.end());
  long long ans = 0;
  int ost = n;
  int i = -1;
  while (ost > 0) {
    i++;
    int cost = v[i].first;
    int a = v[i].second.first;
    int b = v[i].second.second;
    int ca = get_p(a);
    int cb = get_p(b);
    if (ca != cb) {
      ans += cost;
      un(ca, cb);
      if (a == 0) {
        plants.push_back(b);
      } else {
        nodes.push_back({a, b});
      }
      ost -= 1;
    }
  }
  cout << ans << "\n";
  cout << plants.size() << "\n";
  for (int x = 0; x < plants.size(); x++) cout << plants[x] << ' ';
  cout << '\n' << nodes.size() << "\n";
  for (int i = 0; i < nodes.size(); i++) {
    cout << nodes[i].first << ' ' << nodes[i].second << "\n";
  }
  return 0;
}
