#include <iostream>
#include <map>
#include <cmath>
#include <string>
#include <vector>
#include <cstring>
#define INF 1000000000
#define EP 1e-6
using namespace std;
struct point{
int x;
int y;
};
struct DD{
int i,j;
double cst,edge;
DD(double cst,double edge,int i,int j):cst(cst),edge(edge),i(i),j(j){
}
bool operator < (const DD& d )const{
if(abs(cst-d.cst)>=EP)
return cst<d.cst;
if(abs(edge-d.edge)>=EP)
return edge>d.edge;
if(i!=d.i)
return i>d.i;
if(j!=d.j)
return j>d.j;
return false;
}
};
vector<DD> vb;
double gr[55][55];
double road[55][55];
point P[55];
int main()
{
int N,M;
int a,b;
while(cin>>N)
{
cin>>M;
if(N+M==0)
break;
for(int i=1;i<=N;i++)
{
cin>>a>>b;
P[i].x = a;
P[i].y = b;
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(i==j)
{
gr[i][j]=0;
road[i][j]=0;
}
else
{
gr[i][j]=INF;
road[i][j]=INF;
}
}
}
for(int i=1;i<=M;i++)
{
cin>>a>>b;
double d = (P[a].x-P[b].x)*(P[a].x-P[b].x)+(P[a].y-P[b].y)*(P[a].y-P[b].y);
d = sqrt(d);
road[a][b]=1;
road[b][a]=1;
gr[a][b]=d;
gr[b][a]=d;
}
for(int k=1;k<=N;k++)
{
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(gr[i][j]>gr[i][k]+gr[k][j])
gr[i][j] = gr[i][k]+gr[k][j];
}
}
}//end of warshall
double cost;
double tempedge;
DD ans(0,0,0,0);
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(road[i][j]==1)
continue;
cost = 0;
tempedge = sqrt((P[i].x-P[j].x)*(P[i].x-P[j].x) + (P[i].y-P[j].y)*(P[i].y-P[j].y));
for(int u=1;u<=N;u++)
{
for(int v=1;v<=N;v++)
{
cost+= (gr[u][v]-
min(gr[u][v],min(gr[u][i]+tempedge+gr[j][v],gr[v][i]+tempedge+gr[j][u])));
}
}
DD dd = DD(cost,tempedge,i,j);
ans = max(ans,dd);
}
}
if(ans.cst-1>EP)
cout<<ans.i<<" "<<ans.j<<"\n";
else
cout<<"No road required\n";
}
return 0;
}