void dfs(vector<int>& signal,vector<bool> & mask, vector<vector<int> > &path, vector<vector<int> >& matrix, int nowNode, int T,int nowTime, int & minValue){
if(nowTime >= minValue) return;
if(nowNode == T){
minValue = min(minValue, nowTime);
return;
}
int waitTime = 0;
if(nowTime / signal[nowNode] % 2 == 1) {
waitTime = signal[nowNode] - nowTime % signal[nowNode];
}
nowTime += waitTime;
mask[nowNode] = true;
for(int i=0;i<path[nowNode].size();i++){
if(!mask[path[nowNode][i]]){
nowTime += matrix[nowNode][path[nowNode][i]];
dfs(signal,mask,path,matrix,path[nowNode][i],T,nowTime,minValue);
nowTime -= matrix[nowNode][path[nowNode][i]];
}
}
mask[nowNode] = false;
}
int minTravelTime(int N, vector < vector < int > > intersections, int M, vector < vector < int > > roads, int s, int t) {
vector<bool> mask(N,false);
vector<int> signal(N,0);
for(int i=0;i<N;i++){
signal[intersections[i][0]] = intersections[i][1];
}
vector<vector<int> > path(N);
vector<vector<int> > matrix(N,vector<int>(N,0));
for(int i=0;i<M;i++){
path[roads[i][0]].push_back(roads[i][1]);
path[roads[i][1]].push_back(roads[i][0]);
matrix[roads[i][0]][roads[i][1]] = roads[i][2];
matrix[roads[i][1]][roads[i][0]] = roads[i][2];
}
int result = 0x7fffffff;
dfs(signal,mask,path,matrix,s,t,0,result);
return result;
}