#include <bits/stdc++.h>   using namespace std;   const double EPS = 1e-9;   const double PI = 3.14159265359;   vector<long long> primes;   void GeneratingPrimes(int top) {     vector<bool> p(top + 1, 1);     p[0] = p[1] = 0;     for (int i = 2; i <= sqrt(top); i++) {       if (!p[i]) continue;       if (p[i]) {         for (int j = i * i; j <= top; j += i) {           p[j] = 0;         }       }     }     for (int i = 0; i < top + 1; i++)       if (p[i]) primes.push_back(i);   }   long long gcd(long long a, long long b) { return (b == 0) ? a : gcd(b, a % b); }   long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }   void EXTgcd(long long a, long long b, int& x0, int& y0) {     if (b == 0) {       x0 = 1, y0 = 0;       return;     }     EXTgcd(b, a % b, x0, y0);     long long x1 = y0;     long long y1 = x0 - (a / b) * y0;     x0 = x1;     y0 = y1;   }   unsigned long long power(unsigned long long x, unsigned long long y) {     long long res = 1;     while (y > 0) {       if (y & 1) res = (res * x);       y = y >> 1;       x = (x * x);     }     return res;   }   double dist(double a, double b, double x, double y) {     return sqrt(pow(a - x, 2) + pow(b - y, 2));   }   double dist3(double a, double b, double c, double x, double y, double z) {     return sqrt(pow(a - x, 2) + pow(b - y, 2) + pow(c - z, 2));   }   int xadd[9] = {1, -1, 0, 1, -1, 0, 1, -1, 0};   int yadd[9] = {1, -1, 0, -1, 0, 1, 0, 1, -1};   long long const N = 10007;   long long mod = 1e9 + 7;   int n;   long long x[N], y[N];   long long c[N], k[N];   int setsNum;   int siz[N], par[N];   void build(int n) {     setsNum = 0;     for (int i = 0; i < n; i++) {       par[i] = i;       siz[i] = 1;     }   }   int findSet(int x) {     if (par[x] == x) return x;     par[x] = findSet(par[x]);     return par[x];   }   bool sameSet(int x, int y) { return (par[findSet(x)] == par[findSet(y)]); }   void unionSets(int x, int y) {     int X = findSet(x), Y = findSet(y);     if (X == Y) return;     if (c[X] < c[Y]) {       par[Y] = par[X];     } else {       par[X] = par[Y];     }   }   vector<vector<long long>> sortedE;   int state[N];   vector<pair<int, int>> e;   int main() {     cin >> n;     long long ans = 0, conn = 0, st = n;     for (int i = 0; i < n; i++) state[i] = 1;     build(n + 100);     for (int i = 0; i < n; i++) {       cin >> x[i] >> y[i];     }     for (int i = 0; i < n; i++) cin >> c[i], ans += c[i];     for (int i = 0; i < n; i++) cin >> k[i];     for (int i = 0; i < n; i++)       for (int j = i + 1; j < n; j++) {         vector<long long> t;         t.push_back((k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j])));         t.push_back(i);         t.push_back(j);         sortedE.push_back(t);       }     sort(sortedE.begin(), sortedE.end());     for (int i = 0; i < sortedE.size(); i++) {       if (!sameSet(sortedE[i][1], sortedE[i][2]) &&           sortedE[i][0] + min(c[par[sortedE[i][1]]], c[par[sortedE[i][2]]]) <               c[par[sortedE[i][1]]] + c[par[sortedE[i][2]]]) {         ans -= max(c[par[sortedE[i][1]]], c[par[sortedE[i][2]]]);         if (c[par[sortedE[i][1]]] > c[par[sortedE[i][2]]]) {           state[par[sortedE[i][1]]] = 0;         } else           state[par[sortedE[i][2]]] = 0;         ans += sortedE[i][0];         unionSets(sortedE[i][1], sortedE[i][2]);         e.push_back(make_pair(sortedE[i][1], sortedE[i][2]));         conn++, st--;       }     }     cout << ans << endl << st << endl;     for (int i = 0; i < n; i++)       if (state[i]) printf( %d  , i + 1);     cout << endl << conn << endl;     for (int i = 0; i < e.size(); i++) {       printf( %d %d n , e[i].first + 1, e[i].second + 1);     }     return 0;   }