Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
	"math"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	dd := make([][]int, 1000)
	for i := range dd {
		dd[i] = make([]int, 1000)
	}
	num := make([]int,1000)
	inv := make([]int, 1001)
	x := make([]int, 1000)
	y := make([]int, 1000)
	vv := make([]int, 1000)
	nowt := make([]float64, 1000)
	rev := make([]int, 1000)
	for scanner.Scan() {
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		for i := 0; i < n; i++ {
			scanner.Scan()
			buf1 := strings.Split(scanner.Text(), " ")
			num[i], _ = strconv.Atoi(buf1[0])
			x[i], _ = strconv.Atoi(buf1[1])
			y[i], _ = strconv.Atoi(buf1[2])
			inv[num[i]] = i
		}
		for i := 0; i < n; i++ {
			for j := 0; j < n; j++ {
				dd[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])
			}
		}
		scanner.Scan()
		m, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < m; i++ {
			scanner.Scan()
			buf2 := strings.Split(scanner.Text(), " ")
			c, _ := strconv.Atoi(buf2[0])
			d, _ := strconv.Atoi(buf2[1])
			c = inv[c]
			d = inv[d]
			for j := 0; j < n; j++ {
				vv[j] = 0
				nowt[j]=999999999
				rev[j]=-1
			}
			nowt[c]=0
			for j := 0; j < n; j++ {
				M := 99999999
				at := 0
				for k := 0; k < n; k++ {
					if vv[k] == 0 && float64(M) > nowt[k] {
						M=int(nowt[k])
						at = k
					}
				}
				if M > 90000000 {
					break
				}
				vv[at]=1
				for k := 0; k < n; k++ {
					if vv[k] == 0 && dd[at][k]<=2500&&nowt[k]>nowt[at]+math.Sqrt(float64(dd[at][k])) {
						nowt[k]=nowt[at]+math.Sqrt(float64(dd[at][k]))
						rev[k] = at
					}
				}
			}
			if vv[d] == 0 {
				fmt.Println("NA")
			} else {
				stack := make([]int, 0)
				V := d
				for V != c {
					stack = append(stack, V)
					V = rev[V]
				}
				fmt.Print(num[c])
				for len(stack) > 0 {
					fmt.Printf(" %d", num[stack[len(stack)-1]])
					stack = stack[:len(stack)-1]
				}
				fmt.Println()
			}
		}
	}
}

C++: #include <iostream>
#include <stdio.h>
#include <math.h>
#include <map>

using namespace std;

multimap<double,int> mp;

struct bir {
	double x,y,m;
	int to[1001],fr;
};

bir b[1000];

multimap<double,int>::iterator it;

int search(int s,int e) {
	int n,i;
	double m,k;
	b[s].m=0; b[s].fr=-1; 
	mp.insert(multimap<double,int>::value_type(0,s));
	while(!mp.empty()) {
		it=mp.begin();
		n=(*it).second; m=(*it).first;
		mp.erase(it);
		if (b[n].m<m) continue;
		for (i=0;b[n].to[i]>=0;i++) {
			k=sqrt((b[n].x-b[b[n].to[i]].x)*(b[n].x-b[b[n].to[i]].x)+(b[n].y-b[b[n].to[i]].y)*(b[n].y-b[b[n].to[i]].y));
			if (b[b[n].to[i]].m>b[n].m+k) {
				mp.insert(multimap<double,int>::value_type(b[n].m+k,b[n].to[i]));
				b[b[n].to[i]].fr=n; b[b[n].to[i]].m=b[n].m+k;
			}
		}
	}
    if (b[e].m==999999999) return 0;
	return 1;
}

int main() {
 int bn,i,j,k,n,s,e,an[1000],num[1000],rn[1000];
 while(cin >> bn) {
	 if (bn==0) break;
	 for (i=0;i<bn;i++) { cin >> num[i] >> b[i].x >> b[i].y; rn[num[i]]=i;}
	 for (i=0;i<bn;i++) {
		 for (j=0,k=0;j<bn;j++) if (i!=j) if ((b[i].x-b[j].x)*(b[i].x-b[j].x)+(b[i].y-b[j].y)*(b[i].y-b[j].y)<=2500) b[i].to[k++]=j; 
		 b[i].to[k]=-1; b[i].m=999999999;
	 }
     cin >> n;
	 for (i=0;i<n;i++) {
		 cin >> s >> e;
		 s=rn[s]; e=rn[e];
		 if (search(s,e)==1) {
			 j=0;
			 while(e>=0) {an[j++]=num[e]; e=b[e].fr;}
			 for (;j>0;j--) { cout << an[j-1]; if (j>1) cout << ' ';}
			 cout << endl;
		 } else cout << "NA" << endl;
	 }
 }
return 0;
 }

C++: #include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<stack>
using namespace std;
#define INF 1e30
#define EPS 1e-4
#define EQ(a,b) (fabs((a)-(b))<EPS)

double dist[1000][1000];
int id[1000],x[1000],y[1000];

double Distance(int i,int j){
	return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}


int main(){
	int n;
	while(cin>>n&&n){
		for(int i=0;i<n;i++)cin>>id[i]>>x[i]>>y[i];
		for(int i=0;i<n;i++)for(int j=0;j<n;j++){
			double d=Distance(i,j);
			dist[i][j]=(d<=50?d:INF);
		}
		for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)
			dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
		int m;
		cin>>m;
		for(int i=0;i<m;i++){
			int s,g;
			cin>>s>>g;
			s--;g--;
			if(dist[s][g]==INF){
				cout<<"NA\n";
				continue;
			}
			stack<int> st;
			int v=g;
			while(v!=s){
				for(int i=0;i<n;i++){
					if(i==v)continue;
					if(EQ(dist[s][v],dist[s][i]+Distance(i,v))){
						st.push(v);
						v=i;
						break;
					}
				}
			}
			cout<<id[s];
			while(!st.empty()){
				cout<<' '<<id[st.top()];
				st.pop();
			}
			cout<<endl;
		}
	}
	return 0;
}

C++: #include <iostream>
#include <cmath>
#define ROPE 50.0
#define NEXTD -30

using namespace std;
void reachable();
double dist(int,int);
int inv_in(int,int);

int index_[1000],x[1000],y[1000];
double dst[1000][1000];
int next[1000][1000];

int main(){
  //  int tmp;
  int b_num,root_num;
  //int index[1000],x[1000],y[1000];
  int s_index[1000],g_index[1000];
  //int map[1000];
  while(cin >> b_num && b_num!=0){
    //cin >> a;
    //cout << b_num << " Number of Buildings." <<endl;
    //cout << a << endl;

    //rîñÇÝÝA£vZ
    for(int i=0;i<b_num;i++){  
      //while(cin >>tmp){
      cin >> index_[i] >> x[i] >> y[i];
      //cout << index_[i] <<" " << x[i] <<" "<< y[i] << endl;
      for(int j=0;j<=i;j++){
	dst[i][j]= (dist(i,j) > ROPE) ? 10000000.0 : 100000+dist(i,j);
	dst[j][i]= dst[i][j];
	next[i][j] = (dist(i,j) > ROPE) ? NEXTD : j;
	next[j][i] = (dist(i,j) > ROPE) ? NEXTD : i;
      }
    }

    for(int k=0; k<b_num;k++){
      for(int i =0; i<b_num; i++){
	for(int j =0; j<b_num; j++){
	  if(dst[i][j] > dst[i][k] + dst[k][j]){
	    //cout << dst[i][j] << "Í" << dst[i][k] << "Æ" << dst[k][j] << "æèå«¢";
	    dst[i][j] = dst[i][k] + dst[k][j];
	    next[i][j] = next[i][k];
	    //cout << i << "ida" << j << "jda" << next[i][j] << "£XV" << endl;
	  }
	  //cout << i <<"ida" << j << "jda" << next[i][j] <<endl;
	}
      }
    }
    
    cin >> root_num;
    for(int i=0;i < root_num;i++){
      cin >> s_index[i] >> g_index[i];
      int S=inv_in(b_num,s_index[i]);
      int G=inv_in(b_num,g_index[i]);
      //cout << s_index[i] <<" " << g_index[i] <<" Start and Goal index"<< endl;
      //cout << inv_in(b_num,s_index[i]) <<" " << inv_in(b_num,g_index[i]) 
      //	   <<" Start and Goal num"<< endl;
      
      //cout << "S" << S << "G" << G << endl;
 
      if(next[S][G]!=NEXTD){
	for(int j=S;j!=G;j=next[j][G]){
	  cout << index_[j] << ' ' ;
	}
	cout << index_[G] << endl;
      }
      else{
	cout << "NA" << endl;
      }    
    }
    
    
    /*
    for(int i=0;i<b_num;i++){
      for(int k=0;k<b_num;k++){
	cout << next[i][k] << " -> " << i << "Æ" << k << "ÆÌÔÌÌs«æ" << endl; 
	//	dst[i][j]
      }
      cout << endl;
    }
    */
  }
  
}

double dist(int i,int j){
  double dis;
  dis = pow(pow(double(x[i]-x[j]),2.0)+pow(double(y[i]-y[j]),2.0),0.5);
  return dis;
}

int inv_in(int b_num,int b_ind){
  int inv;
  for(int j=0;j<b_num;j++){
    if(index_[j]==b_ind){
      inv = j;
      break;
    }
  }
  return inv;
}