#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
const double PI = 3.14159265359;
vector<long long> primes;
void GeneratingPrimes(int top) {
  vector<bool> p(top + 1, 1);
  p[0] = p[1] = 0;
  for (int i = 2; i <= sqrt(top); i++) {
    if (!p[i]) continue;
    if (p[i]) {
      for (int j = i * i; j <= top; j += i) {
        p[j] = 0;
      }
    }
  }
  for (int i = 0; i < top + 1; i++)
    if (p[i]) primes.push_back(i);
}
long long gcd(long long a, long long b) { return (b == 0) ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
void EXTgcd(long long a, long long b, int& x0, int& y0) {
  if (b == 0) {
    x0 = 1, y0 = 0;
    return;
  }
  EXTgcd(b, a % b, x0, y0);
  long long x1 = y0;
  long long y1 = x0 - (a / b) * y0;
  x0 = x1;
  y0 = y1;
}
unsigned long long power(unsigned long long x, unsigned long long y) {
  long long res = 1;
  while (y > 0) {
    if (y & 1) res = (res * x);
    y = y >> 1;
    x = (x * x);
  }
  return res;
}
double dist(double a, double b, double x, double y) {
  return sqrt(pow(a - x, 2) + pow(b - y, 2));
}
double dist3(double a, double b, double c, double x, double y, double z) {
  return sqrt(pow(a - x, 2) + pow(b - y, 2) + pow(c - z, 2));
}
int xadd[9] = {1, -1, 0, 1, -1, 0, 1, -1, 0};
int yadd[9] = {1, -1, 0, -1, 0, 1, 0, 1, -1};
long long const N = 10007;
long long mod = 1e9 + 7;
int n;
long long x[N], y[N];
long long c[N], k[N];
int setsNum;
int siz[N], par[N];
void build(int n) {
  setsNum = 0;
  for (int i = 0; i < n; i++) {
    par[i] = i;
    siz[i] = 1;
  }
}
int findSet(int x) {
  if (par[x] == x) return x;
  par[x] = findSet(par[x]);
  return par[x];
}
bool sameSet(int x, int y) { return (par[findSet(x)] == par[findSet(y)]); }
void unionSets(int x, int y) {
  int X = findSet(x), Y = findSet(y);
  if (X == Y) return;
  if (c[X] < c[Y]) {
    par[Y] = par[X];
  } else {
    par[X] = par[Y];
  }
}
vector<vector<long long>> sortedE;
int state[N];
vector<pair<int, int>> e;
int main() {
  cin >> n;
  long long ans = 0, conn = 0, st = n;
  for (int i = 0; i < n; i++) state[i] = 1;
  build(n + 100);
  for (int i = 0; i < n; i++) {
    cin >> x[i] >> y[i];
  }
  for (int i = 0; i < n; i++) cin >> c[i], ans += c[i];
  for (int i = 0; i < n; i++) cin >> k[i];
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      vector<long long> t;
      t.push_back((k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j])));
      t.push_back(i);
      t.push_back(j);
      sortedE.push_back(t);
    }
  sort(sortedE.begin(), sortedE.end());
  for (int i = 0; i < sortedE.size(); i++) {
    if (!sameSet(sortedE[i][1], sortedE[i][2]) &&
        sortedE[i][0] + min(c[par[sortedE[i][1]]], c[par[sortedE[i][2]]]) <
            c[par[sortedE[i][1]]] + c[par[sortedE[i][2]]]) {
      ans -= max(c[par[sortedE[i][1]]], c[par[sortedE[i][2]]]);
      if (c[par[sortedE[i][1]]] > c[par[sortedE[i][2]]]) {
        state[par[sortedE[i][1]]] = 0;
      } else
        state[par[sortedE[i][2]]] = 0;
      ans += sortedE[i][0];
      unionSets(sortedE[i][1], sortedE[i][2]);
      e.push_back(make_pair(sortedE[i][1], sortedE[i][2]));
      conn++, st--;
    }
  }
  cout << ans << endl << st << endl;
  for (int i = 0; i < n; i++)
    if (state[i]) printf("%d ", i + 1);
  cout << endl << conn << endl;
  for (int i = 0; i < e.size(); i++) {
    printf("%d %d\n", e[i].first + 1, e[i].second + 1);
  }
  return 0;
}
