#include<queue>
#include<cstdio>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

const int INF=1<<29;

class edge{
public:
	int v,cost;
	edge(int v,int cost):v(v),cost(cost){}
};

int main(){
	for(int n,m,k;scanf("%d%d%d",&n,&m,&k),n;){
		vector<edge> G[100];
		int d[100][100];
		rep(u,n) rep(v,n) d[u][v]=(u==v?0:INF);
		rep(_,m){
			int u,v,cost; scanf("%d%d%d",&u,&v,&cost);
			d[u][v]=d[v][u]=cost;
			G[u].push_back(edge(v,cost));
			G[v].push_back(edge(u,cost));
		}

		rep(w,n) rep(u,n) rep(v,n) d[u][v]=min(d[u][v],d[u][w]+d[w][v]);

		double dp[100][100]={}; // dp[u][v] := ( u->v 間の最短経路の個数 )
		// 謎の魔法によって Floyd で最短経路の個数が計算できる
		// rep(u,n) rep(i,G[u].size()) {
			// int v=G[u][i].v,cost=G[u][i].cost;
			// if(d[0][u]+cost+d[v][n-1]==d[0][n-1]) dp[u][v]=1; // 最初は dp には最短経路 DAG の隣接行列が入っている
		// }
		// rep(w,n) rep(u,n) rep(v,n) dp[u][v]+=dp[u][w]*dp[w][v];

		// まじめに Dijkstra してもよい
		rep(u,n){
			dp[u][u]=1;
			int d2[100];
			rep(v,n) d2[v]=(v==u?0:INF);
			priority_queue< pair<int,int> > Q; Q.push(make_pair(0,u));
			while(!Q.empty()){
				int d_now=-Q.top().first,v=Q.top().second; Q.pop();
				rep(i,G[v].size()){
					int w=G[v][i].v,cost=G[v][i].cost;
					if(d[0][v]+cost+d[w][n-1]==d[0][n-1]){ // 最短経路 DAG の辺であるかどうか
						if(d2[w]>=d2[v]+cost){
							if(d2[w]>d2[v]+cost){
								d2[w]=d2[v]+cost;
								Q.push(make_pair(-d2[w],w));
							}
							dp[u][w]+=dp[u][v];
						}
					}
				}
			}
		}

		rep(_,k){
			int c; scanf("%d",&c);
			printf("%.9f\n",dp[0][c]*dp[c][n-1]/dp[0][n-1]);
		}
		puts("");
	}

	return 0;
}