#include <bits/stdc++.h>
using namespace std;
signed main() {
  long long n;
  cin >> n;
  long long x[n], y[n], c[n], k[n], num[n + 1];
  for (long long i = 0; i < n; i++) {
    cin >> x[i] >> y[i];
  }
  for (long long i = 0; i < n; i++) {
    cin >> c[i];
  }
  for (long long i = 0; i < n; i++) {
    cin >> k[i];
    num[i] = i;
  }
  num[n] = n;
  vector<pair<long long, pair<long long, long long> > > edges, ansEdges;
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < n; j++)
      edges.push_back(
          {(k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j])), {i, j}});
  for (long long i = 0; i < n; i++) edges.push_back({c[i], {i, n}});
  sort(edges.begin(), edges.end());
  for (long long i = 0; i < edges.size(); i++) {
    long long v1 = edges[i].second.first, v2 = edges[i].second.second;
    if (num[v1] != num[v2]) {
      long long oldNum = num[v2];
      for (long long i = 0; i <= n; i++) {
        if (num[i] == oldNum) num[i] = num[v1];
      }
      ansEdges.push_back(edges[i]);
    }
  }
  long long degN = 0, sumW = 0, e = 0;
  vector<long long> childsN;
  vector<pair<long long, long long> > outEdges;
  for (long long i = 0; i < ansEdges.size(); i++) {
    long long v1 = min(ansEdges[i].second.first, ansEdges[i].second.second),
              v2 = max(ansEdges[i].second.first, ansEdges[i].second.second);
    sumW += ansEdges[i].first;
    if (v2 == n) {
      degN++;
      childsN.push_back(v1);
    } else {
      outEdges.push_back(ansEdges[i].second);
    }
  }
  cout << sumW << endl;
  cout << childsN.size() << endl;
  for (long long i = 0; i < childsN.size(); i++) {
    cout << childsN[i] + 1 << ' ';
  }
  cout << endl << outEdges.size() << endl;
  for (long long i = 0; i < outEdges.size(); i++) {
    cout << outEdges[i].first + 1 << ' ' << outEdges[i].second + 1 << endl;
  }
  return 0;
}
