#include <bits/stdc++.h>
template <typename T>
inline T in() {
  T ans = 0;
  bool b = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') b = (ch == '-'), ch = getchar();
  while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - 48, ch = getchar();
  return b ? -ans : ans;
}
const int Mx = 2005;
const long long INF = LLONG_MAX / 4;
int n;
struct City {
  int x, y;
  long long c, k;
} C[Mx];
long long dis(City x, City y) {
  return std::abs(x.x - y.x) + std::abs(x.y - y.y);
}
struct Edge {
  int x, y;
  long long v;
} E[Mx * Mx];
int top, fa[Mx];
long long ans;
std::vector<int> bld, lnk;
void addEdge(int x, int y, long long v) { E[++top] = (Edge){x, y, v}; }
bool cmp(Edge a, Edge b) { return a.v < b.v; }
int ask(int x) { return fa[x] == x ? x : fa[x] = ask(fa[x]); }
int main() {
  scanf("%d", &n);
  for (register int i = 1; i <= n; ++i) fa[i] = i;
  for (register int i = 1; i <= n; ++i) scanf("%d%d", &C[i].x, &C[i].y);
  for (register int i = 1; i <= n; ++i) scanf("%lld", &C[i].c);
  for (register int i = 1; i <= n; ++i) scanf("%lld", &C[i].k);
  for (register int i = 1; i <= n; ++i) addEdge(0, i, C[i].c);
  for (register int i = 1; i <= n; ++i) {
    for (register int j = i + 1; j <= n; ++j) {
      addEdge(i, j, dis(C[i], C[j]) * (C[i].k + C[j].k));
    }
  }
  std::sort(E + 1, E + 1 + top, cmp);
  for (int i = 1, sum; i <= top; i++) {
    int xx = ask(E[i].x);
    int yy = ask(E[i].y);
    if (xx == yy) continue;
    fa[xx] = yy;
    ans += E[i].v;
    if (E[i].x == 0)
      bld.push_back(E[i].y);
    else
      lnk.push_back(i);
    sum++;
    if (sum == n) break;
  }
  printf("%lld\n", ans);
  printf("%d\n", bld.size());
  for (int i = 0; i < bld.size(); ++i) printf("%d ", bld[i]);
  puts("");
  printf("%d\n", lnk.size());
  for (int i = 0; i < lnk.size(); ++i)
    printf("%d %d\n", E[lnk[i]].x, E[lnk[i]].y);
}
