#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

//INSERT ABOVE HERE

const int MAX = 202;

int O[MAX][MAX];
int C[MAX][MAX];

int X[MAX][MAX];
int Y[MAX][MAX];
int A[MAX][MAX];
int B[MAX][MAX];

int P[MAX][MAX];
int Q[MAX][MAX];
int R[MAX][MAX];

int E[MAX][MAX];
int F[MAX][MAX];
int G[MAX][MAX];
int H[MAX][MAX];

signed main(){
  int n,m,s,t;
  while(cin>>n>>m>>s>>t,n){
    s--;t--;
    memset(O,0,sizeof(O));
    memset(C,0,sizeof(O));
    memset(X,0,sizeof(O));
    memset(Y,0,sizeof(O));
    memset(A,0,sizeof(O));
    memset(B,0,sizeof(O));

    memset(P,0,sizeof(O));
    memset(Q,0,sizeof(O));
    memset(R,0,sizeof(O));

    struct State{
      int u,v;
      char c;
      State(int u,int v,char c):u(u),v(v),c(c){}
    };

    queue<State> que;
    for(int i=0;i<m;i++){
      int a,b;
      char c;
      cin>>a>>b>>c;
      a--;b--;
      if(c=='+'||c=='*') O[a][b]|=1;
      if(c=='a') C[a][b]|=1;

      if(c=='(') X[a][b]|=1;
      if(c==')') Y[a][b]|=1;
      if(c=='[') A[a][b]|=1;
      if(c==']') B[a][b]|=1;

      if(c=='a'){
        if(R[a][b]) continue;
        R[a][b]=1;
        que.emplace(a,b,'a');
      }
    }

    memset(E,0,sizeof(O));
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        for(int k=0;k<n;k++)
          E[i][k]|=C[i][j]&&O[j][k];

    memset(F,0,sizeof(O));
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        for(int k=0;k<n;k++)
          F[i][k]|=O[i][j]&&C[j][k];

    memset(G,0,sizeof(O));
    memset(H,0,sizeof(O));

    while(!que.empty()){
      State cur=que.front();que.pop();
      int u=cur.u,v=cur.v;
      if(cur.c=='a'){
        for(int w=0;w<n;w++){
          if(E[w][u]&&!R[w][v]){
            R[w][v]=1;
            que.emplace(w,v,'a');
          }
          if(X[w][u]&&!P[w][v]){
            P[w][v]=1;
            que.emplace(w,v,'(');
          }
          if(A[w][u]&&!Q[w][v]){
            Q[w][v]=1;
            que.emplace(w,v,'[');
          }

          if(F[v][w]&&!R[u][w]){
            R[u][w]=1;
            que.emplace(u,w,'a');
          }

          if(O[w][u]&&!G[w][v]){
            G[w][v]=1;
            que.emplace(w,v,'+');
          }
          if(O[v][w]&&!H[u][w]){
            H[u][w]=1;
            que.emplace(u,w,'*');
          }
        }
      }
      if(cur.c=='('){
        for(int w=0;w<n;w++){
          if(Y[v][w]&&!R[u][w]){
            R[u][w]=1;
            que.emplace(u,w,'a');
          }
        }
      }
      if(cur.c=='['){
        for(int w=0;w<n;w++){
          if(B[v][w]&&!R[u][w]){
            R[u][w]=1;
            que.emplace(u,w,'a');
          }
        }
      }

      if(cur.c=='+'){
        for(int w=0;w<n;w++){
          if(R[w][u]&&!R[w][v]){
            R[w][v]=1;
            que.emplace(w,v,'a');
          }
        }
      }
      if(cur.c=='*'){
        for(int w=0;w<n;w++){
          if(R[v][w]&&!R[u][w]){
            R[u][w]=1;
            que.emplace(u,w,'a');
          }
        }
      }
    }

    cout<<(R[s][t]?"Yes":"No")<<endl;
  }
  return 0;
}



Measured memory_bytes: 7388