#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
template <typename T, typename S>
ostream& operator<<(ostream& os, pair<T, S> a) {
  os << '(' << a.first << ',' << a.second << ')';
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> v) {
  for (auto x : v) os << x << ' ';
  return os;
}
void debug() { cerr << '\n'; }
template <typename H, typename... T>
void debug(H a, T... b) {
  cerr << a;
  if (sizeof...(b)) cerr << ", ";
  debug(b...);
}
class UnionFind {
 private:
  int sz;
  vector<int> par, size_;

 public:
  UnionFind() {}
  UnionFind(int node_size) : sz(node_size), par(sz), size_(sz, 1) {
    iota(par.begin(), par.end(), 0);
  }
  int find(int x) {
    if (par[x] == x)
      return x;
    else
      return par[x] = find(par[x]);
  }
  void unite(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return;
    if (size_[x] < size_[y]) swap(x, y);
    par[y] = x;
    size_[x] += size_[y];
  }
  int size(int x) {
    x = find(x);
    return size_[x];
  }
  bool same(int x, int y) { return find(x) == find(y); }
};
struct edge {
  int from, to;
  ll cost;
  bool operator<(const edge& b) const { return cost < b.cost; }
};
int main() {
  int n;
  cin >> n;
  vector<int> x(n), y(n), c(n), k(n);
  vector<edge> e;
  for (int i = 0; i < (int)(n); ++i) cin >> x[i] >> y[i];
  for (int i = 0; i < (int)(n); ++i) cin >> c[i];
  for (int i = 0; i < (int)(n); ++i) cin >> k[i];
  for (int i = 0; i < (int)(n); ++i) e.push_back((edge){i, n, c[i]});
  for (int i = 0; i < (int)(n); ++i)
    for (int j = 0; j < (int)(n); ++j) {
      if (i < j) {
        e.push_back((edge){
            i, j,
            (long long)(k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j]))});
      }
    }
  sort(e.begin(), e.end());
  vector<pii> ans;
  vector<int> p;
  UnionFind uf(n + 1);
  ll cost = 0;
  for (const auto& x : e) {
    if (uf.same(x.from, x.to)) continue;
    uf.unite(x.from, x.to);
    if (x.to != n)
      ans.emplace_back(x.from, x.to);
    else
      p.push_back(x.from);
    cost += x.cost;
  }
  cout << cost << endl;
  cout << p.size() << endl;
  for (int i = 0; i < (int)(p.size()); ++i)
    cout << p[i] + 1 << " \n"[i == p.size() - 1];
  cout << ans.size() << endl;
  for (auto x : ans) {
    cout << x.first + 1 << " " << x.second + 1 << endl;
  }
}
