#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-9;
int n;
long long x[2015], y[2015], k[2015], c[2015];
bool ok[2015];
int pre[2015];
vector<pair<int, int> > res;
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    que;
long long dis[2015];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%lld%lld", &x[i], &y[i]);
  }
  for (int i = 1; i <= n; ++i) scanf("%lld", &c[i]);
  for (int i = 1; i <= n; ++i) scanf("%lld", &k[i]);
  for (int i = 1; i <= n; ++i) {
    dis[i] = c[i];
    que.push(pair<long long, int>(dis[i], i));
  }
  long long ans = 0;
  while (que.size()) {
    pair<long long, int> pp = que.top();
    que.pop();
    long long d = pp.first;
    int u = pp.second;
    if (ok[u]) continue;
    ans += d;
    if (d == c[u]) {
      pre[u] = 0;
    } else {
      res.push_back(pair<int, int>(u, pre[u]));
    }
    for (int v = 1; v <= n; ++v) {
      if (ok[v] || u == v) continue;
      long long cost = (k[u] + k[v]) * (abs(x[u] - x[v]) + abs(y[u] - y[v]));
      if (cost < dis[v]) {
        dis[v] = cost;
        pre[v] = u;
        que.push(pair<long long, int>(dis[v], v));
      }
    }
    ok[u] = true;
  }
  printf("%lld\n%d\n", ans, n - (int)res.size());
  for (int i = 1; i <= n; i++)
    if (pre[i] == 0) printf("%d ", i);
  puts("");
  printf("%d\n", (int)res.size());
  for (auto p : res) printf("%d %d\n", p.first, p.second);
  return 0;
}
