#include <stdio.h>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <sstream>

using namespace std;

#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

typedef long long ll;

const int INF=500000000;
const int MAX_V = 210;
const int MAX_R = 1010;
int n,m,r;
int land[MAX_V][MAX_V];
int sea[MAX_V][MAX_V];
int citys[MAX_R];
void calcLandMinDist(){
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            for(int k = 0; k < n; k++)
                land[j][k] = min(land[j][k],land[j][i]+land[i][k]);
}
void calcSeaMinDist(){
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            for(int k = 0; k < n; k++)
                sea[j][k] = min(sea[j][k],sea[j][i]+sea[i][k]);
}
int dp[MAX_R][MAX_V];
// WzæªidxÌÔÚÌÆ±ëÅA{[gªboatÌm[hÉ éÆ«ÌÅ¬zBÔ
int rec(int idx,int boat){
    if(idx==r)
        return 0;
    if(dp[idx][boat]!=INF)
        return dp[idx][boat];
    int minTime=INF;
    // ¤ÌÝðgÁÄB·éê
    minTime=min(minTime,rec(idx+1,boat)+land[citys[idx-1]][citys[idx]]);
    // CàgÁÄB·éê
    // »ÝÌboatÌÊu©çBÅ«é`¬·×ÄÉÂ¢Ä·
    for(int i = 0; i < n; i++){
        minTime=min(minTime,rec(idx+1,i)+land[citys[idx-1]][boat]
        + sea[boat][i] + land[i][citys[idx]]);
    }
    return dp[idx][boat]=minTime;
}

int main(){
    while(cin>>n>>m&&!(n==0&&m==0)){
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                if(i==j)
                    land[i][j]=sea[i][j]=0;
                else
                    land[i][j]=sea[i][j]=INF;
        for(int i = 0; i < m; i++){
            int from,to,cost;
            char kind;
            cin>>from>>to>>cost>>kind;
            from--;to--;
            if(kind=='L'){
                land[from][to]=min(land[from][to],cost);
                land[to][from]=min(land[to][from],cost);
            }
            else{
                sea[from][to]=min(sea[from][to],cost);
                sea[to][from]=min(sea[to][from],cost);
            }
        }
        cin>>r;
        for(int i = 0; i < r; i++){
            cin>>citys[i];
            citys[i]--;
        }
        calcLandMinDist();
        calcSeaMinDist();
        // dpÅÅZ£ðßé
        for(int i = 0; i < r; i++)
            for(int j = 0; j < n; j++)dp[i][j]=INF;
        dp[0][citys[0]]=0;
        // Wzæ
        for(int i = 1; i < r; i++){
            // ¡Ì{[gÌê
            for(int j = 0; j < n; j++){
                dp[i][j]=min(dp[i][j],dp[i-1][j]+land[citys[i-1]][citys[i]]);
                // Ì{[gÌê
                for(int k = 0; k < n; k++){
                    dp[i][k]=min(dp[i][k],dp[i-1][j]+land[citys[i-1]][j]
                    +sea[j][k]+land[k][citys[i]]);
                }
            }
        }
        //int res=rec(1,citys[0]);
        int res=INF;
        for(int i = 0; i < n; i++)
            res=min(res,dp[r-1][i]);
        cout<<res<<endl;
    }
    return 0;
}
/*
Èº¦ÍÅ«P[XÅªöxÅoÍ³êéªAAOJÅÍà¿ëñTLE·éR[h
_CNXg@ðgpµÄð¼Éð¢Ä¢é
*/
//struct edge{
//	int to;
//	int cost;
//    char kind;
//};
//
//class Situation{
//public:
//	int cost;
//	int node;
//    int boat;
//    int obj;
//
//	Situation(int cost_,int node_,int boat_,int obj_){
//		cost=cost_;
//        node=node_;
//        boat=boat_;
//        obj=obj_;
//	}
//	Situation();
//
//	bool operator<(const Situation &s)const{
//		return s.cost < this->cost;
//	}
//};
//
//int V;
//int n,m;
//
//vector<int> objLands;
//
//const int MAX_V = 205;
//const int MAX_M = 1001;
//vector<edge> G[MAX_V];
//int d[MAX_V][MAX_M][MAX_V];
//const int INF = 1000000000;
//
//void dijkstra(int s){
//	priority_queue<Situation> que;
//    for(int i = 0; i < MAX_V; i++)
//        for(int j = 0; j < MAX_M; j++)
//            for(int k = 0; k < MAX_V; k++)
//                d[i][j][k]=INF;
//    d[s][0][s] = 0;
//    que.push(Situation(0,s,s,0));
//	while(!que.empty()){
//		Situation p = que.top();
//		que.pop();
//        int node=p.node;
//        int boat=p.boat;
//        int cost=p.cost;
//        int obj=p.obj;
//        // ¡ñÈOÉß½»ÝÌÊuÌRXgÌûª¬³¢
//		if(d[node][obj][boat] < cost)
//            continue;
//		for(int i = 0; i < G[node].size(); i++){
//			edge &e = G[node][i];
//            int toObj=obj;
//            // Ú®n_Ìm[hªÚInÅ éêAÚInð©ßé
//            if(objLands[obj]==e.to)
//                toObj++;
//            // ¤ÌêÆCÌêÅêí¯
//            if(e.kind=='L'){
//                // ÅZ£
//                if(d[e.to][toObj][boat]>d[node][obj][boat]+e.cost){
//                    d[e.to][toObj][boat]=d[node][obj][boat]+e.cost;
//                    if(toObj!=objLands.size())
//                        que.push(Situation(d[e.to][toObj][boat],e.to,boat,toObj));
//                }
//            }
//            else{
//                // CoRÅÚ®·é½ßÉÍA»ÝÌêÉDª é±ÆªKv
//                if(boat==node){
//                    if(d[e.to][toObj][e.to]>d[node][obj][boat]+e.cost){
//                        d[e.to][toObj][e.to]=d[node][obj][boat]+e.cost;
//                        if(toObj!=objLands.size())
//                            que.push(Situation(d[e.to][toObj][e.to],e.to,e.to,toObj));
//                    }
//                }
//            }
//		}
//	}
//}
//
//int main(){
//
//    while(cin>>n>>m&&!(n==0&&m==0)){
//        objLands.clear();
//        for(int i = 0; i < MAX_V; i++)
//            G[i].clear();
//        for(int i = 0; i < m; i++){
//            int from,to,cost;
//            char c;
//            cin>>from>>to>>cost>>c;
//            from--;to--;
//            edge e;
//            e.cost=cost;e.kind=c;e.to=to;
//            G[from].push_back(e);
//            e.to=from;
//            G[to].push_back(e);
//        }
//        int t;
//        cin>>t;
//        int s;
//        for(int i = 0; i < t; i++){
//            if(i==0){
//                cin>>s;
//                s--;
//            }
//            else{
//                int b;
//                cin>>b;
//                b--;
//                objLands.push_back(b);
//            }
//        }
//        dijkstra(s);
//        int minCost=INF;
//        for(int i = 0; i < n; i++){
//            for(int j = 0; j < n; j++)
//                minCost=min(minCost,d[objLands[objLands.size()-1]][objLands.size()][j]);
//        }
//        cout<<minCost<<endl;
//    }
//    return 0;
//}

Measured memory_bytes: 0