http://acm.hdu.edu.cn/showproblem.php?pid=2437
//1364284 2009-05-13 20:11:33 Accepted 2437 187MS 4444K 1362 B C++ no way 
#include <iostream>
#include 
<vector>
using namespace std;

const int N = 1004;

typedef 
struct 
{
    
int vex;
    
int cost;
}
node;

vector
<node> vv[N];

int ans, e;
char path[N];
int num[N][N];//num[i][j]表示走到i结点花费mod K 的最小值
int n, m, s, k;
int pcnt;

void init()
{
    
for(int i = 1; i <= n; i++)
        vv[i].clear();
    ans 
= e = -1;
    memset(num, 
-1sizeof(num));
}


void make_graph()
{
    
int a, b, cost;
    node cc;

    
for(int i = 0; i < m; i++)
    
{
        scanf(
"%d%d%d"&a, &b, &cost);

        cc.vex 
= b; cc.cost = cost;
        vv[a].push_back(cc);
       
// follows the tunnels you can not go back to the starting burrow.
        
//表示单向图
       
// cc.vex = a;
        
//vv[b].push_back(cc);
    }

}


void dfs(int v,int costs)
{    
    
int i,j,p,t;
    
if(path[v] =='P' && costs % k == 0 && (ans ==-1 || ans > costs || (ans == costs && v < e)))
    
{
        ans 
= costs;
        e 
= v;
    }

    j 
= vv[v].size();
    
if(!j)
        
return ;    
    
for(i=0;i<j;i++)
    
{
        p 
= vv[v][i].vex;
        t 
= vv[v][i].cost + costs;
        
if(num[p][t%k] == -1 || num[p][t%k] > t)
        
{
            num[p][t
%k] = t;
            dfs(p,t);
        }

    }

}


int main()
{
    
int T,i, kk;
    scanf(
"%d"&T);
    
for(i = 1; i <= T; i++)
    
{
        scanf(
"%d%d%d%d"&n, &m, &s, &k);
        getchar();
        scanf(
"%s", path + 1);
        init();
        make_graph();
        dfs(s,
0 );
        cout
<<"Case "<<i<<""<<ans<<" "<<e<<endl;
    }

    
return 0;
}