// Original C++ solution (slower):
#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int inf=0x3f3f3f3f;

const int maxn=2e2+10;

int n,m,num;

int costl[maxn][maxn],costs[maxn][maxn];

int dp[1005][maxn];

int a[1005];

int main()

{

    while(scanf("%d%d",&n,&m)&&n&&m)

    {

        for(int i=1;i<=n;i++)

            for(int j=1;j<=n;j++)

            {

                if(i==j)

                {

                    costl[i][j]=costs[i][j]=0;

                }

                else

                {

                     costl[i][j]=costs[i][j]=inf/3;

                }

            }

        for(int i=1;i<=m;i++)

        {

            char s[2];

            int x,y,val;

            scanf("%d%d%d%s",&x,&y,&val,s);

            if(s[0]=='L')

            {

                costl[x][y]=costl[y][x]=min(val,costl[x][y]);

            }

            else

            {

                costs[x][y]=costs[y][x]=min(val,costs[x][y]);

            }

        }

        scanf("%d",&num);

        for(int i=1;i<=num;i++)

        {

            scanf("%d",&a[i]);

        }

        for(int k=1;k<=n;k++)

            for(int i=1;i<=n;i++)

                for(int j=1;j<=n;j++)

                {

                    costs[i][j]=min(costs[i][j],costs[i][k]+costs[k][j]);

                    costl[i][j]=min(costl[i][j],costl[i][k]+costl[k][j]);

                }

        memset(dp,0x3f,sizeof(dp));

        dp[1][a[1]]=0;

        for(int i=2;i<=num;i++)

            for(int j=1;j<=n;j++)

            {

                dp[i][j]=min(dp[i][j],dp[i-1][j]+costl[a[i-1]][a[i]]);

                for(int k=1;k<=n;k++)

                {

                    //dp[i][k]=min(dp[i][k],dp[i-1][j]+costl[a[i-1]][j]+costs[j][k]+costl[k][a[i]]);

                    dp[i][j]=min(dp[i][j],dp[i-1][k]+costl[a[i-1]][k]+costs[k][j]+costl[j][a[i]]);

                }

            }

        int ans=inf;

        for(int i=1;i<=n;i++)

        {

            ans=min(ans,dp[num][i]);

        }

        printf("%d\n",ans);

    }

}

// Optimized solution to the same problem (faster):
#include<cstdio>

#include<cstring>

#include<algorithm>

#include<vector>

using namespace std;

int n,m,i,j,k,r,a[1005],ans,map[256][256][2],dp[10005][256];//map:0?路，1水路,dp[i][j]在送到i个?子船在j??的最少花?

int main()

{

	//freopen("1.in","r",stdin);

	//freopen("1.out","w",stdout);

	while(~scanf("%d %d",&n,&m)&&n&&m)

	{

		for(i=1;i<=n;i++)

		{

			for(j=1;j<=n;j++)

			{

				map[i][j][0]=1000000;

				map[i][j][1]=1000000;

			}

			map[i][i][0]=0;

			map[i][i][1]=0;

		}

		int x,y,t,o;

		char s;

		for(i=1;i<=m;i++)

		{

			scanf("\n%d %d %d %c",&x,&y,&t,&s);

			if(s=='L')

				o=0;

			if(s=='S')

				o=1;

			map[x][y][o]=min(map[x][y][o],t);

			map[y][x][o]=map[x][y][o];

		}

		for(k=1;k<=n;k++)

			for(i=1;i<=n;i++)

				for(j=1;j<=n;j++)

				{

						map[i][j][0]=min(map[i][j][0],map[i][k][0]+map[k][j][0]);

						map[i][j][1]=min(map[i][j][1],map[i][k][1]+map[k][j][1]);	

				}

		scanf("%d",&r);

		for(i=1;i<=r;i++)

			scanf("%d",&a[i]);

		for(i=1;i<=r;i++)

			for(j=1;j<=n;j++)

				dp[i][j]=1000000;

		dp[1][a[1]]=0;

		for(i=1;i<=n;i++)

		{

			if(map[a[0]][i][1]<2147483647&&map[i][a[0]][0]<2147483647)

			dp[0][i]=map[a[0]][i][1]+map[i][a[0]][0];

		}

		for(i=2;i<=r;i++)

		{

			for(k=1;k<=n;k++)

			{

				dp[i][k]=min(dp[i][k],dp[i-1][k]+map[a[i-1]][a[i]][0]);

				for(j=1;j<=n;j++)

					dp[i][j]=min(dp[i][j],dp[i-1][k]+map[a[i-1]][k][0]+map[k][j][1]+map[j][a[i]][0]);

			}

		}

		ans=2147483647;

		for(i=1;i<=n;i++)

			ans=min(ans,dp[r][i]);

		printf("%d\n",ans);

	}

}

// Fastest known solution for this problem: