#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
const double pi = acos((double)-1);
const long long MAXN = 10000;
const long long mod = 1e9 + 7;
class Edge {
 public:
  int u, v;
  long long w;
  Edge() {}
  Edge(int a, int b, long long c) : u(a), v(b), w(c) {}
  bool operator<(const Edge &m) const { return w < m.w; }
  bool operator>(const Edge &m) const { return w > m.w; }
};
int mp[2005][2];
long long c[2005];
long long k[2005];
bool vis[2005];
priority_queue<Edge, vector<Edge>, greater<Edge> > Q;
vector<int> ans1;
vector<Edge> ans2;
int main() {
  int n;
  cin >> n;
  long long ans = 0;
  for (int i = 0; i < n; i++) cin >> mp[i][0] >> mp[i][1];
  for (int i = 0; i < n; i++) cin >> c[i];
  for (int i = 0; i < n; i++) cin >> k[i];
  for (int i = 0; i < n; i++) {
    Q.push(Edge(n, i, c[i]));
  }
  vis[n] = 1;
  while (!Q.empty()) {
    Edge e = Q.top();
    Q.pop();
    if (vis[e.v]) continue;
    vis[e.v] = 1;
    if (e.u == n)
      ans1.push_back(e.v);
    else
      ans2.push_back(e);
    ans += e.w;
    for (int i = 0; i < n; i++) {
      if (vis[i]) continue;
      Q.push(Edge(e.v, i,
                  (k[i] + k[e.v]) * (abs(mp[i][0] - mp[e.v][0]) +
                                     abs(mp[i][1] - mp[e.v][1]))));
    }
  }
  cout << ans << "\n";
  cout << ans1.size() << "\n";
  for (int i = 0; i < ans1.size(); i++) {
    if (i) cout << ' ';
    cout << ans1[i] + 1;
  }
  cout << "\n";
  cout << ans2.size() << "\n";
  for (int i = 0; i < ans2.size(); i++) {
    cout << ans2[i].u + 1 << ' ' << ans2[i].v + 1 << "\n";
  }
  return 0;
}
