kruskal
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int u,v,w;
bool operator<(node x){return w<x.w;}
}e[4000010];
vector<pair<int,int> >v1;
vector<int>v2;
int x[2010],y[2010],c[2010],k[2010];
int idx;
int n,m;
int tmp,f[2010];
int cnt,ans;
void init(int x)
{
for(int i=1;i<=x;i++)
f[i]=i;
}
int find(int x)
{
if(f[x]==x)
return x;
return f[x]=find(f[x]);
}
void un(int x,int y)
{
x=find(x),y=find(y);
if(x!=y)
f[x]=y;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
init(n);
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=1;i<=n;i++)
{
cin>>c[i];
idx++;
e[idx].u=n+1;
e[idx].v=i;
e[idx].w=c[i];
}
for(int i=1;i<=n;i++)
cin>>k[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(x[i]!=x[j]&&y[i]!=y[j])
{
++idx;
e[idx].u=i;
e[idx].v=j;
e[idx].w=(abs(x[i]-x[j])+abs(y[i]-y[j]))*(k[i]+k[j]);
}
}
}
sort(e+1,e+idx+1);
for(int i=1;i<=idx;i++)
{
if(find(e[i].u)!=find(e[i].v))
{
cnt++;
ans+=e[i].w;
if(e[i].u!=n+1)
v1.push_back(make_pair(e[i].u,e[i].v));
else
v2.push_back(e[i].v);
un(e[i].u,e[i].v);
}
else
continue;
}
cout<<ans<<endl<<v2.size()<<endl;
for(auto i:v2)
cout<<i<<" ";
cout<<endl;
if(v1.size())
for(auto i:v1)
cout<<i.first<<" "<<i.second<<endl;
else
cout<<0<<endl;
return 0;
}