#include <bits/stdc++.h>
using namespace std;
long long x[3000];
long long y[3000];
long long c[3000];
long long k[3000];
long long dist[3000][3000];
long long inx[3000];
bool flag[3000];
bool vis[3000];
long long cost[3000];
long long conn[3000];
struct cmp {
  bool operator()(const long long a, const long long b) { return c[a] < c[b]; }
};
struct node {
  int inx;
  int cost;
  node() {}
  node(int a, int b) {
    inx = a;
    cost = b;
  }
  bool operator<(const node &a) const { return cost > a.cost; }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  long long n;
  cin >> n;
  for (long long i = 1; i <= n; i++) {
    cin >> x[i] >> y[i];
    inx[i] = i;
  }
  int mx = 1;
  for (long long i = 1; i <= n; i++) {
    cin >> c[i];
    if (c[i] < c[mx]) mx = i;
    cost[i] = c[i];
    flag[i] = true;
  }
  priority_queue<node> q;
  for (int i = 1; i <= n; i++) q.push(node(i, cost[i]));
  for (long long i = 1; i <= n; i++) cin >> k[i];
  for (long long i = 1; i <= n; i++)
    for (long long j = 1; j <= n; j++)
      dist[i][j] = (k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j]));
  while (!q.empty()) {
    node x = q.top();
    q.pop();
    if (x.cost != cost[x.inx]) continue;
    vis[x.inx] = true;
    for (int j = 1; j <= n; j++) {
      if (j == x.inx || vis[j]) continue;
      if (cost[j] > dist[x.inx][j]) {
        flag[j] = false;
        cost[j] = dist[x.inx][j];
        conn[j] = x.inx;
        q.push(node(j, cost[j]));
      }
    }
  }
  long long ans = 0;
  long long cnt = 0;
  long long cnnt = 0;
  for (long long i = 1; i <= n; i++) {
    ans += cost[i];
    cnt += flag[i];
    cnnt += (conn[i] != 0);
  }
  cout << ans << endl;
  cout << cnt << endl;
  for (long long i = 1; i <= n; i++) {
    if (flag[i]) {
      cout << i;
      if (--cnt) cout << " ";
    }
  }
  cout << endl << cnnt << endl;
  for (long long i = 1; i <= n; i++) {
    if (conn[i] != 0) cout << i << " " << conn[i] << endl;
  }
  return 0;
}
