#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
long long exp(long long a, long long b) {
  long long ans = 1;
  while (b > 0) {
    if (b & 1) {
      ans = ans * a;
    }
    a = a * a;
    b = b / 2;
  }
  return ans;
}
long long findPar(long long a, vector<long long> &par) {
  if (par[a] != a) {
    par[a] = findPar(par[a], par);
  }
  return par[a];
}
void Union(long long a, long long b, vector<long long> &par,
           vector<long long> &rank) {
  if (rank[a] < rank[b]) {
    par[par[a]] = par[b];
  } else if (rank[a] == rank[b]) {
    par[par[a]] = par[b];
    rank[b]++;
  } else {
    par[par[b]] = par[a];
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long n, i, j, x, y;
  cin >> n;
  vector<pair<long long, long long>> arr(n);
  for (i = 0; i < n; i++) {
    cin >> x >> y;
    arr[i] = {x, y};
  }
  vector<long long> c(n);
  for (i = 0; i < n; i++) {
    cin >> c[i];
  }
  vector<long long> k(n);
  for (i = 0; i < n; i++) {
    cin >> k[i];
  }
  vector<pair<long long, pair<long long, long long>>> Edges;
  j = 0;
  for (i = 0; i < n; i++) {
    Edges.push_back({c[i], {0, i + 1}});
    Edges.push_back({c[i], {i + 1, 0}});
  }
  for (i = 0; i < n; i++) {
    for (long long l = i + 1; l < n; l++) {
      Edges.push_back({(k[i] + k[l]) * (abs(arr[i].first - arr[l].first) +
                                        abs(arr[i].second - arr[l].second)),
                       {i + 1, l + 1}});
      Edges.push_back({(k[i] + k[l]) * (abs(arr[i].first - arr[l].first) +
                                        abs(arr[i].second - arr[l].second)),
                       {l + 1, i + 1}});
    }
  }
  vector<pair<long long, long long>> Taken;
  long long cost = 0;
  vector<long long> par(n + 1);
  vector<long long> rank(n + 1);
  for (i = 0; i <= n; i++) {
    par[i] = i;
    rank[i] = 1;
  }
  long long p1, p2;
  sort(Edges.begin(), Edges.end());
  for (i = 0; i < Edges.size(); i++) {
    p1 = findPar(Edges[i].second.first, par);
    p2 = findPar(Edges[i].second.second, par);
    if (p1 != p2) {
      Taken.push_back(Edges[i].second);
      cost += Edges[i].first;
      Union(p1, p2, par, rank);
    }
  }
  cout << cost << "\n";
  long long v;
  v = 0;
  for (i = 0; i < Taken.size(); i++) {
    if (Taken[i].first == 0 || Taken[i].second == 0) {
      v++;
    }
  }
  cout << v << "\n";
  for (i = 0; i < Taken.size(); i++) {
    if (Taken[i].first == 0) {
      cout << Taken[i].second << " ";
    } else if (Taken[i].second == 0) {
      cout << Taken[i].first << " ";
    }
  }
  cout << "\n";
  cout << Taken.size() - v << "\n";
  for (i = 0; i < Taken.size(); i++) {
    if (Taken[i].first != 0 && Taken[i].second != 0) {
      cout << Taken[i].first << " " << Taken[i].second << "\n";
    }
  }
  return 0;
}
