#include <bits/stdc++.h>
using namespace std;
int par[2001];
bool turned[2001];
vector<pair<long long, pair<int, int>>> edges;
long long x[2001], y[2001];
long long c[2001], k[2001];
int findPar(int x) {
  if (x == par[x]) return x;
  return par[x] = findPar(par[x]);
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> x[i] >> y[i];
    par[i] = i;
  }
  for (int i = 1; i <= n; i++) {
    cin >> c[i];
  }
  for (int i = 1; i <= n; i++) cin >> k[i];
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
      long long dist = (abs(x[i] - x[j]) + abs(y[i] - y[j])) * (k[i] + k[j]);
      edges.push_back(make_pair(dist, make_pair(i, j)));
    }
    edges.push_back(make_pair(c[i], make_pair(i, i)));
  }
  sort(edges.begin(), edges.end());
  vector<int> turnedOn;
  vector<pair<int, int>> connRes;
  long long res = 0;
  int curOn = 0;
  int ctr = 0;
  while (curOn < n) {
    auto &e = edges[ctr++];
    int u = e.second.first;
    int v = e.second.second;
    long long cost = e.first;
    if (turned[findPar(u)] && turned[findPar(v)]) continue;
    if (u == v) {
      res += cost;
      turnedOn.push_back(u);
      turned[findPar(u)] = true;
      curOn++;
    } else if (findPar(u) != findPar(v)) {
      turned[findPar(v)] = turned[findPar(v)] | turned[findPar(u)];
      par[findPar(u)] = findPar(v);
      res += cost;
      connRes.push_back(make_pair(u, v));
      curOn++;
    }
  }
  cout << res << '\n';
  cout << turnedOn.size() << '\n';
  for (int x : turnedOn) {
    cout << x << ' ';
  }
  cout << '\n';
  cout << connRes.size() << '\n';
  for (auto &p : connRes) {
    cout << p.first << ' ' << p.second << '\n';
  }
}
