/*
    参考watashi  Orz
    题意:先求一个有向图从0到其他点的最短路中,询问某些点在这些最短路出现的次数
    先dij 或 spfa 求最短路  然后dp,用乘法原理
    “可以分别求出0到节点v的最短路数和从节点v出发的最短路数,而经过包含v的最短路数就是这二者的乘积”
    最后结果是保留最后10位,中间的乘法用long long也会超
    “用布斯(Booth)乘法”
    高位的不用乘,方正 % MOD = 0

    我是建正图反图两次dfs的
*/

#include
<cstdio>
#include
<cstring>
#include
<algorithm>
#include
<queue>

using namespace std;

const int MAXN = 10086;
const long long MOD = 10000000000;
const int INF = 1000000000;

struct Node
{
    
int v,w;
    Node 
*next;
}
;

Node 
*E[MAXN],*_E[MAXN],*pE,nodes[MAXN*10];
long long s[MAXN] , t[MAXN];
long long dist[MAXN];
bool vi[MAXN],in[MAXN];

void init(int N)
{
    pE 
= nodes;
    
for(int i=0;i<N;i++)E[i] = _E[i] = NULL;
}


void addEdge(int u,int v,int w)
{
    pE
->= v;
    pE
->=w;
    pE
->next = E[u];
    E[u] 
= pE++;

    pE
->= u;
    pE
->=w;
    pE
->next = _E[v];
    _E[v] 
= pE++;
}


long long mul(long long a,long long b)
{
    
long long la = a % 100000;
    
long long lb = b % 100000;
    
return ( (a / 100000 * lb + b / 100000 * la) * 100000 + la * lb) % MOD;
    
// a / 100000 * b / 100000 这个不用了因为%MOD后还是为0
}


long long add(long long a,long long b)
{
    a 
+= b;
    
if(a >= MOD) a %= MOD;
    
return a;
}


void spfa(int N)
{
    
for(int i=1;i<N;i++)
    
{
        dist[i] 
= INF;
        
in[i] = false;
    }

    dist[
0= 0;
    
in[0= true;
    queue
<int>Q;
    Q.push(
0);
    
while(!Q.empty())
    
{
        
int u = Q.front();Q.pop();
        
in[u] = false;
        
for( Node *it = E[u]; it; it = it->next )
        
{
            
int v = it->v, w = it->w;
            
if( dist[v] > dist[u] + w )
            
{
                dist[v] 
= dist[u] + w;
                
if(!in[v])
                
{
                    
in[v] = true;
                    Q.push(v);
                }

            }

        }

    }

}


void forward(int u)//calculate the success Edge  t[]
{
    
for( Node *it = E[u]; it; it = it->next)
    
{
        
int v = it->v, w = it->w;
        
if(dist[v] == dist[u] + w)
        
{
            
if(!vi[v])forward(v);
            t[u] 
= add(t[u],t[v]);
        }

    }

    vi[u] 
= true;
}


void backward(int u)//calculate the pre Edge  s[]
{
    
for( Node *it = _E[u]; it; it = it->next)
    
{
        
int v = it->v, w = it->w;
        
if(dist[u] == dist[v] + w)
        
{
            
if(!vi[v])backward(v);
            s[u] 
= add(s[u] , s[v]);
        }

    }

    vi[u] 
= true;
}


int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen(
"in","r",stdin);
#endif

    
int N,Q,M;
    
while~scanf("%d%d%d",&N,&M,&Q) )
    
{
        init(N);
        
int u,v,w;
        
for(int i=0;i<M;i++)
        
{
            scanf(
"%d%d%d",&u,&v,&w);
            addEdge(u,v,w);
        }

        spfa(N);
        
for(int i=0; i<N; i++)
        
{
            s[i] 
= 0;
            t[i] 
= 1;
        }

        s[
0= 1;
        memset(vi,
0,sizeof(vi));
        forward(
0);
        memset(vi,
0,sizeof(vi));
        
for(int i=0;i<N;i++)
        
{
            
if(!vi[i])backward(i);
        }

        
forint i = 0; i<Q; i++)
        
{
            scanf(
"%d",&u);
            printf(
"%010lld\n",mul(s[u],t[u]));
        }

    }

    
return 0;
}