
#include <iostream>
#include <cmath>
#define N 110
using namespace std;
int n,d,u[N],v[N],mp[N][N],flag,vis[N];
void dfs(int s){
if(50-abs(u[s])<=d||50-abs(v[s])<=d){
flag=1;
return;
}
vis[s]=1;
for(int i=1;i<=n;i++){
if(!vis[i]&&mp[s][i]) dfs(i);
}
}
int main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>u[i]>>v[i];
if(abs(u[i])<8&&abs(v[i])<8) continue;
if(abs(u[i])>50&&abs(v[i])>50) continue;
if(sqrt(u[i]*u[i]*1.0+v[i]*v[i])-7.5<=d) mp[0][i]=mp[i][0]=1;
for(int j=1;j<i;j++){//建图dfs
if((u[i]-u[j])*(u[i]-u[j])+(v[i]-v[j])*(v[i]-v[j])<=d*d) mp[i][j]=mp[j][i]=1;
}
}
dfs(0);
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}

#include <iostream>
#include <vector>
#include <cmath>
#define N 110
using namespace std;
int n,d,u[N],v[N],mp[N][N],flag,vis[N],cnt,mincnt=N;
vector<int> ans,path;
void dfs(int s){
if(cnt>mincnt) return;//剪枝
if(50-abs(u[s])<=d||50-abs(v[s])<=d){//判断是否能到达岸边
flag=1;
if(cnt<mincnt) mincnt=cnt,ans=path;//步数最少
else{//步数相同选第一跳最近
int k=ans[0],t=path[0];
if(u[k]*u[k]+v[k]*v[k]>=u[t]*u[t]+v[t]*v[t]) ans=path;
}
return;
}
for(int i=0;i<=n;i++){
if(!vis[i]&&mp[s][i]) {
path.push_back(i);
cnt++;
vis[i]=1;
dfs(i);
path.pop_back();//三条回溯
cnt--;
vis[i]=0;
}
}
}
int main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>u[i]>>v[i];
if(abs(u[i])<8&&abs(v[i])<8) continue;
if(abs(u[i])>50&&abs(v[i])>50) continue;
if(sqrt(u[i]*u[i]*1.0+v[i]*v[i])-7.5<=d) mp[0][i]=mp[i][0]=1;
for(int j=1;j<i;j++){//建图
if((u[i]-u[j])*(u[i]-u[j])+(v[i]-v[j])*(v[i]-v[j])<=d*d) mp[i][j]=mp[j][i]=1;
}
}
vis[0]=1;
dfs(0);
if(!flag) cout<<"0"<<endl;
else{
cout<<mincnt+1<<endl;
for(int i=0;i<ans.size();i++) cout<<u[ans[i]]<<" "<<v[ans[i]]<<endl;
}
return 0;
}