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 <algorithm>
#include <cmath>
#include <vector>

using namespace std;

const int INF = 1e8;
const int MAX_V = 1010;
const double eps = 1e-10;

double cost[MAX_V][MAX_V];
double d[MAX_V];
int prev[MAX_V];
bool used[MAX_V];
int V;

void dijkstra(int s) {
    fill(d, d + V, INF);
    fill(used, used + V, false);
    fill(prev, prev+V, -1);
    d[s] = 0;
    while(true) {
        int v = -1;
        for(int u=0; u < V; u++){
            if (!used[u] && (v == -1 || d[u] < d[v])) v = u;
        }
        if (v == -1) break;
        used[v] = true;

        for(int u=0; u < V; u++){
            if(d[u] > d[v] + cost[v][u]){
                d[u] = d[v] + cost[v][u];
                prev[u] = v;
            }
        }
    }
}

vector<int> get_path(int t){
    vector<int> path;
    for(; t != -1; t = prev[t]) path.push_back(t);
    reverse(path.begin(), path.end());
    return path;
}

int main(){
    while(cin >> V, V){
        for(int i=0; i< 1010; i++) for(int j=0; j< 1010; j++) cost[i][j] = INF;
        int b[1010];
        int bb[1010];
        double x[1010], y[1010];
        for(int i=0; i< V; i++){
            cin >> b[i] >> x[i] >> y[i];
            bb[b[i]] = i;
        }
        for(int i=0; i < V; i++){
            for(int j=0; j < V; j++){
                if(i == j) continue;
                double d = sqrt(pow(abs(x[i]-x[j]), 2)+pow(abs(y[i]-y[j]), 2));
                if(d-eps <=  50.0){
                    cost[i][j] = d;
                }
            }
        }
        int m;
        cin >> m;
        for(int p=0; p < m; p++){
            int s, g;
            cin >> s >> g;
            dijkstra(bb[s]);
            vector<int> path = get_path(bb[g]);
            if(path.size() ==1) cout << "NA" << endl;
            else{
                for(int i=0; i< path.size(); i++) cout << (i==0?"": " ") << b[path[i]];
                cout << endl;
            }
        }
    }
}

C++: #include <string>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cmath>
#define ROPE 50
#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) > 50.0) ? 10000000.0 : 100000+dist(i,j);
	dst[j][i]= dst[i][j];
	next[i][j] = (dist(i,j) > 50.0) ? NEXTD : j;
	next[j][i] = (dist(i,j) > 50.0) ? 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++){
      int S,G;
      cin >> s_index[i] >> g_index[i];
      S=inv_in(b_num,s_index[i]);
      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[i][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;
    }
    */
  }
  
}

void reachable(int i){
  if(dist(i,i+1) <=ROPE){
    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;
}