#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define lld long double
#define nodecnt 100005
#define INF (1<<20)
#define mod 1000000007
lld key[nodecnt],x[nodecnt],y[nodecnt];
bool donewith[nodecnt];
lli nodes,edges,start,dest,p,ans;
std::vector<pair<lli,lli> > graph[nodecnt] ;
lld eucdist(lli i,lli j)
{
return ceil(p*sqrt(((x[i]-x[j])*(x[i]-x[j]))+((y[i]-y[j])*(y[i]-y[j]))));
}
void prims()
{
ans=0;
set<pair<lld,lli> > Q;
for(lli i=1;i<=nodes;i++)
key[i]=INF,donewith[i]=false,Q.insert(make_pair(key[i],i));
Q.erase(Q.find(make_pair(key[start],start)));
key[start]=0;
Q.insert(make_pair(key[start],start));
while(!Q.empty())
{
pair<lld,lli> top=*(Q.begin());
Q.erase(Q.begin());
lli u=top.second;
donewith[u]=true;
if(u!=start)
{
ans+=top.first;
if(ans>=mod)
ans=ans%mod;
}
lli size=graph[u].size();
for(lli i=0;i<size;i++)
{
lli v=graph[u][i].first;
lld w=graph[u][i].second;
if(donewith[v]==false)
{
if(key[v]>w)
{
Q.erase(Q.find(make_pair(key[v],v)));
key[v]=w;
Q.insert(make_pair(key[v],v));
}
}
}
}
}
int main(int argc, char const *argv[])
{
lli t;
scanf("%lld",&t);
for(lli T=1;T<=t;T++)
{
scanf("%lld %lld",&nodes,&p);
for(lli i=1;i<=nodes;i++)
graph[i].clear();
for(lli i=1;i<=nodes;i++)
scanf("%Lf %Lf",&x[i],&y[i]);
for(lli i=1;i<=nodes;i++)
{
for(lli j=i+1;j<=nodes;j++)
{
lld temp=eucdist(i,j);
graph[i].push_back(make_pair(j,temp));
graph[j].push_back(make_pair(i,temp));
}
}
start=1,ans=0;
prims();
printf("Scenario #%lld: %lld\n",T,ans);
}
return 0;
}
CSNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgoJdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCSNkZWZpbmUgbGxpIGxvbmcgbG9uZyBpbnQKCSNkZWZpbmUgbGxkIGxvbmcgZG91YmxlCgkjZGVmaW5lIG5vZGVjbnQgMTAwMDA1CgkjZGVmaW5lIElORiAoMTw8MjApCgkjZGVmaW5lIG1vZCAxMDAwMDAwMDA3CglsbGQga2V5W25vZGVjbnRdLHhbbm9kZWNudF0seVtub2RlY250XTsKCWJvb2wgZG9uZXdpdGhbbm9kZWNudF07CglsbGkgbm9kZXMsZWRnZXMsc3RhcnQsZGVzdCxwLGFuczsKCXN0ZDo6dmVjdG9yPHBhaXI8bGxpLGxsaT4gPiBncmFwaFtub2RlY250XSA7CglsbGQgZXVjZGlzdChsbGkgaSxsbGkgaikKCXsKCQlyZXR1cm4gY2VpbChwKnNxcnQoKCh4W2ldLXhbal0pKih4W2ldLXhbal0pKSsoKHlbaV0teVtqXSkqKHlbaV0teVtqXSkpKSk7Cgl9Cgl2b2lkIHByaW1zKCkKCXsKCQlhbnM9MDsKCQlzZXQ8cGFpcjxsbGQsbGxpPiA+IFE7CgkJZm9yKGxsaSBpPTE7aTw9bm9kZXM7aSsrKQoJCQlrZXlbaV09SU5GLGRvbmV3aXRoW2ldPWZhbHNlLFEuaW5zZXJ0KG1ha2VfcGFpcihrZXlbaV0saSkpOwoJCQkKCQlRLmVyYXNlKFEuZmluZChtYWtlX3BhaXIoa2V5W3N0YXJ0XSxzdGFydCkpKTsKCQlrZXlbc3RhcnRdPTA7CgoJCVEuaW5zZXJ0KG1ha2VfcGFpcihrZXlbc3RhcnRdLHN0YXJ0KSk7CgkJd2hpbGUoIVEuZW1wdHkoKSkKCQl7CgkJCXBhaXI8bGxkLGxsaT4gdG9wPSooUS5iZWdpbigpKTsKCQkJUS5lcmFzZShRLmJlZ2luKCkpOwoJCQlsbGkgdT10b3Auc2Vjb25kOwoJCQlkb25ld2l0aFt1XT10cnVlOwoJCQlpZih1IT1zdGFydCkKCQkJewoJCQkJYW5zKz10b3AuZmlyc3Q7CgkJCQlpZihhbnM+PW1vZCkKCQkJCQlhbnM9YW5zJW1vZDsKCQkJfQkJCgkJCWxsaSBzaXplPWdyYXBoW3VdLnNpemUoKTsKCQkJZm9yKGxsaSBpPTA7aTxzaXplO2krKykKCQkJewoJCQkJbGxpIHY9Z3JhcGhbdV1baV0uZmlyc3Q7CgkJCQlsbGQgdz1ncmFwaFt1XVtpXS5zZWNvbmQ7CgkJCQlpZihkb25ld2l0aFt2XT09ZmFsc2UpCgkJCQl7CQoJCQkJCWlmKGtleVt2XT53KQoJCQkJCXsKCQkJCQkJUS5lcmFzZShRLmZpbmQobWFrZV9wYWlyKGtleVt2XSx2KSkpOwoJCQkJCQlrZXlbdl09dzsKCQkJCQkJUS5pbnNlcnQobWFrZV9wYWlyKGtleVt2XSx2KSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoJaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKCXsKCQlsbGkgdDsKCQlzY2FuZigiJWxsZCIsJnQpOwoJCWZvcihsbGkgVD0xO1Q8PXQ7VCsrKQoJCXsKCQkJc2NhbmYoIiVsbGQgJWxsZCIsJm5vZGVzLCZwKTsKCQkJZm9yKGxsaSBpPTE7aTw9bm9kZXM7aSsrKQoJCQkJZ3JhcGhbaV0uY2xlYXIoKTsKCQkJZm9yKGxsaSBpPTE7aTw9bm9kZXM7aSsrKQoJCQkJc2NhbmYoIiVMZiAlTGYiLCZ4W2ldLCZ5W2ldKTsKCQkJZm9yKGxsaSBpPTE7aTw9bm9kZXM7aSsrKQoJCQl7CgkJCQlmb3IobGxpIGo9aSsxO2o8PW5vZGVzO2orKykKCQkJCXsKCQkJCQlsbGQgdGVtcD1ldWNkaXN0KGksaik7CgkJCQkJZ3JhcGhbaV0ucHVzaF9iYWNrKG1ha2VfcGFpcihqLHRlbXApKTsKCQkJCQlncmFwaFtqXS5wdXNoX2JhY2sobWFrZV9wYWlyKGksdGVtcCkpOwoJCQkJfQoJCQl9CgkJCXN0YXJ0PTEsYW5zPTA7CgkJCXByaW1zKCk7CgkJCXByaW50ZigiU2NlbmFyaW8gIyVsbGQ6ICVsbGRcbiIsVCxhbnMpOwoJCX0KCQlyZXR1cm4gMDsKCX0J