#include <bits/stdc++.h>
using namespace std;
vector<pair<long long, pair<long long, long long>>> edges;
long long ans;
vector<long long> stations;
vector<pair<long long, long long>> cables;
long long par[2005];
long long siz[2005];
long long x[2005];
long long y[2005];
long long c[2005];
long long k[2005];
long long f(long long x) {
  while (x != par[x]) x = par[x];
  return x;
}
void unite(long long x, long long y) {
  x = f(x);
  y = f(y);
  if (siz[x] < siz[y]) swap(x, y);
  siz[x] += siz[y];
  par[y] = x;
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) cin >> x[i] >> y[i];
  for (long long i = 0; i < n; i++) cin >> c[i];
  for (long long i = 0; i < n; i++) cin >> k[i];
  for (long long i = 0; i <= n; i++) {
    par[i] = i;
    siz[i] = 1;
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = i + 1; j < n; j++) {
      edges.push_back(
          {(k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j])), {i, j}});
    }
  }
  for (long long i = 0; i < n; i++) {
    edges.push_back({c[i], {i, n}});
  }
  sort(edges.begin(), edges.end());
  for (long long i = 0; i < edges.size(); i++) {
    if (f(edges[i].second.first) == f(edges[i].second.second)) continue;
    unite(f(edges[i].second.first), f(edges[i].second.second));
    ans += edges[i].first;
    if (edges[i].second.second == n) {
      stations.push_back(edges[i].second.first);
      continue;
    }
    cables.push_back({edges[i].second.first, edges[i].second.second});
  }
  cout << ans << "\n";
  cout << stations.size() << "\n";
  for (long long i = 0; i < stations.size(); i++)
    cout << stations[i] + 1 << " ";
  cout << "\n" << cables.size() << "\n";
  for (long long i = 0; i < cables.size(); i++)
    cout << cables[i].first + 1 << " " << cables[i].second + 1 << "\n";
  return 0;
}
