#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e3 + 100;
int fa[MAXN];
int sizeu[MAXN];
void InitUSet(int SIZE) {
  for (int i = 1; i <= SIZE; i++) {
    fa[i] = i;
  }
  for (int i = 1; i <= SIZE; i++) {
    sizeu[i] = 1;
  }
}
int Findfa(int x) {
  if (fa[x] != x) {
    fa[x] = Findfa(fa[x]);
  }
  return fa[x];
  ;
}
void UnionUSet(int x, int y) {
  int xx = Findfa(x);
  int yy = Findfa(y);
  if (xx == yy) {
    return;
  }
  if (sizeu[xx] > sizeu[yy]) {
    fa[yy] = xx;
    sizeu[xx] += sizeu[yy];
  } else {
    fa[xx] = yy;
    sizeu[yy] += sizeu[xx];
  }
}
struct Euv {
  int u;
  int v;
  long long int w;
  Euv() : u(0), v(0), w(0){};
  Euv(int u, int v, long long int w) : u(u), v(v), w(w){};
};
struct cmpEw {
  bool operator()(const Euv e1, const Euv e2) {
    return e1.w > e2.w;
    ;
  }
};
priority_queue<Euv, vector<Euv>, cmpEw> inputE;
queue<Euv> MST;
void InitMST(int N) {
  while (!MST.empty()) MST.pop();
  InitUSet(N);
}
int BuildMST(void) {
  while (!inputE.empty()) {
    int u = inputE.top().u;
    int v = inputE.top().v;
    long long int w = inputE.top().w;
    inputE.pop();
    if (Findfa(u) != Findfa(v)) {
      UnionUSet(u, v);
      MST.push(Euv(u, v, w));
    }
  }
  return Findfa(1);
}
struct node {
  int v;
  long long int w;
  node(int v, long long int w) : v(v), w(w){};
  bool operator<(const node &a) const { return w > a.w; }
};
vector<node> G[MAXN];
inline void InitG(void) {
  for (int i = 0; i < MAXN; i++) {
    G[i].clear();
  }
}
inline void add(int u, int v, long long int w) {
  G[u].push_back(node(v, w));
  G[v].push_back(node(u, w));
}
int n;
vector<int> posx;
vector<int> posy;
vector<long long int> cost;
vector<long long int> k;
int main(int argc, const char *argv[]) {
  scanf("%d", &n);
  posx.resize(n + 1, 0);
  posy.resize(n + 1, 0);
  cost.resize(n + 1, 0);
  k.resize(n + 1, 0);
  for (int i = 1; i <= n; i++) {
    scanf("%d %d", &posx[i], &posy[i]);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &cost[i]);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &k[i]);
  }
  for (int i = 1; i <= n; i++) {
    inputE.push(Euv(0, i, cost[i]));
    for (int j = 1; j <= n; j++) {
      long long int totalk = k[i] + k[j];
      long long int d = abs(posx[i] - posx[j]) + abs(posy[i] - posy[j]);
      inputE.push(Euv(i, j, totalk * d));
    }
  }
  InitMST(n);
  BuildMST();
  queue<int> ansv;
  queue<pair<int, int> > anse;
  long long int ans = 0;
  while (!MST.empty()) {
    int u = MST.front().u;
    int v = MST.front().v;
    long long int w = MST.front().w;
    MST.pop();
    ans += w;
    if (u == 0) {
      ansv.push(v);
    } else if (v == 0) {
      ansv.push(u);
    } else {
      anse.push(pair<int, int>(u, v));
    }
  }
  printf("%lld\n", ans);
  printf("%lu\n", ansv.size());
  while (!ansv.empty()) {
    printf("%d ", ansv.front());
    ansv.pop();
  }
  printf("\n");
  printf("%lu\n", anse.size());
  while (!anse.empty()) {
    printf("%d %d\n", anse.front().first, anse.front().second);
    anse.pop();
  }
  return 0;
}
