#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
const int M = 200100;
const long long mod = 1e9 + 7;
int n;
struct Node {
  int x, y;
} dian[2010];
struct Nod {
  int to, last;
  long long w;
} edge[4000100];
int k[2010];
bool cmp(Nod p, Nod q) { return p.w < q.w; }
int fa[2010];
int find(int p) {
  if (fa[p] == p) return p;
  return fa[p] = find(fa[p]);
}
int tot;
long long sum;
set<int> se;
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    qu;
void krus() {
  sort(edge + 1, edge + 1 + tot, cmp);
  int ans = 0;
  for (int i = 1; i <= tot; i++) {
    int u = find(edge[i].last);
    int v = find(edge[i].to);
    if (u == v) continue;
    if (edge[i].last == 0)
      se.insert(edge[i].to);
    else {
      pair<int, int> p;
      p.first = edge[i].last, p.second = edge[i].to;
      qu.push(p);
    }
    sum += edge[i].w;
    fa[find(u)] = find(v);
    if (++ans == n) break;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= n; i++) cin >> dian[i].x >> dian[i].y;
  for (int i = 1; i <= n; i++) {
    edge[++tot].last = 0;
    edge[tot].to = i;
    cin >> edge[tot].w;
  }
  for (int i = 1; i <= n; i++) cin >> k[i];
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
      edge[++tot].last = i;
      edge[tot].to = j;
      edge[tot].w =
          (long long)(abs(dian[i].x - dian[j].x) + abs(dian[i].y - dian[j].y)) *
          (k[i] + k[j]);
    }
  }
  krus();
  cout << sum << endl;
  cout << se.size() << endl;
  set<int>::iterator it;
  for (it = se.begin(); it != se.end(); it++) cout << *it << " ";
  cout << endl;
  cout << qu.size() << endl;
  while (!qu.empty()) {
    cout << qu.top().first << " " << qu.top().second << endl;
    qu.pop();
  }
  return 0;
}
