#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 4e5 + 10;
multiset<char> conn[MAX_N];
set<int> graph[MAX_N];
bool both[MAX_N];
int dist[MAX_N];
bool self[MAX_N];
vector<pair<int, int> > edges;
int degree[MAX_N];
vector<pair<int, int> > deg;
int main() {
  int n, m;
  cin >> n >> m;
  string S;
  cin >> S;
  S = S + S;
  memset(both, false, sizeof(both));
  memset(degree, 0, sizeof(degree));
  while (m--) {
    int x, y;
    cin >> x >> y;
    if (x == y) {
      y = x + n;
      self[x] = true;
      self[y] = true;
      graph[x].insert(y);
      graph[y].insert(x);
      conn[x].insert(S[x - 1]);
      conn[y].insert(S[y - 1]);
      degree[x] += 1;
      degree[y] += 1;
    } else {
      edges.push_back({x, y});
    }
  }
  for (auto &e : edges) {
    int x = e.first;
    int y = e.second;
    graph[x].insert(y);
    conn[x].insert(S[y - 1]);
    degree[x] += 1;
    if (self[x]) {
      graph[x + n].insert(y);
      conn[x + n].insert(S[y - 1]);
      degree[x + n] += 1;
    }
    graph[y].insert(x);
    conn[y].insert(S[x - 1]);
    degree[y] += 1;
    if (self[y]) {
      graph[y + n].insert(x);
      conn[y + n].insert(S[x - 1]);
      degree[y + n] += 1;
    }
    if (self[x] && self[y]) {
      graph[x + n].insert(y + n);
      conn[x + n].insert(S[y + n - 1]);
      degree[x + n] += 1;
      graph[y + n].insert(x + n);
      conn[y + n].insert(S[x + n - 1]);
      degree[y + n] += 1;
    }
  }
  for (int i = 1; i <= 2 * n; i++) {
    deg.push_back({degree[i], i});
  }
  sort(deg.begin(), deg.end());
  for (int i = 1; i <= 2 * n; i++) {
    if ((conn[i].size() > 0) && (*(conn[i].begin()) != *(conn[i].rbegin())))
      both[i] = true;
  }
  for (auto &i : deg) {
    int u = i.second;
    if (both[u] == false) {
      for (auto &v : graph[u]) {
        graph[v].erase(u);
        conn[v].erase(conn[v].find(S[u - 1]));
        if ((conn[v].size() > 0) && (*(conn[v].begin()) != *(conn[v].rbegin())))
          both[v] = true;
        else
          both[v] = false;
      }
    }
  }
  for (int i = 1; i <= 2 * n; i++) {
    if (both[i] == true) {
      queue<int> q;
      map<int, bool> visited;
      visited[i] = true;
      dist[i] = 0;
      q.push(i);
      while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (auto &v : graph[u]) {
          if (both[v] == true) {
            if (visited.find(v) == visited.end()) {
              dist[v] = dist[u] + 1;
              visited[v] = true;
              if (dist[v] < 2) q.push(v);
            } else if (dist[v] == 2) {
              cout << "Yes" << endl;
              return 0;
            }
          }
        }
      }
      visited.clear();
    }
  }
  cout << "No" << endl;
  return 0;
}
