#include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define rreps(X,S,Y) for (int (X) = (Y)-1;(X) >= (S);--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())
#define Endl endl

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class T,size_t n> ostream& operator<<(ostream &os, const array<T,n> &t) {
	os<<"{"; rep(i,n) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class S, class T,class U> ostream& operator<<(ostream &os, const tuple<S,T,U> &t) { return os<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<")";}
template<class S, class T,class U,class V> ostream& operator<<(ostream &os, const tuple<S,T,U,V> &t) { return os<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<","<<get<3>(t)<<")";}
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
//#undef _DEBUG
#ifdef _DEBUG
#define out(args...){vector<string> a_r_g_s=s_p_l_i_t(#args, ','); e_r_r(a_r_g_s.begin(), args); }
vector<string> s_p_l_i_t(const string &s, char c){vector<string> v;int d=0,f=0;string t;for(char c:s){if(!d&&c==',')v.pb(t),t="";else t+=c;if(c=='\"'||c=='\'')f^=1;if(!f&&c=='(')++d;if(!f&&c==')')--d;}v.pb(t);return move(v);}
void e_r_r(vector<string>::iterator it) {}
template<typename T, typename... Args> void e_r_r(vector<string>::iterator it, T a, Args... args){ if(*it==" 1"||*it=="1") cerr<<endl; else cerr << it -> substr((*it)[0] == ' ', it -> length()) << " = " << a << ", "; e_r_r(++it, args...);}
#else
#define out
#endif
template<typename T>vector<T> table(int n, T v){ return vector<T>(n, v);}
template <class... Args> auto table(int n, Args... args){auto val = table(args...); return vector<decltype(val)>(n, move(val));}
const ll MOD=1e9+7;

struct UF{
  vector<int> data;
  UF(int size):data(size,-1){}
  bool unite(int x,int y){
    x=root(x); y=root(y);
    if(x!=y){
      if(data[y]<data[x]) swap(x,y);
      data[x]+=data[y]; data[y]=x;
    }
    return x!=y;
  }
  bool findSet(int x,int y){return root(x)==root(y);}
  int root(int x){return data[x]<0?x:data[x]=root(data[x]);}
  int size(int x) {return -data[root(x)];}
};
class Bcc{
  vector<int> num,inS;
  stack<int> roots,st;
  int cnt;
public:
  vv<int> bcc,tree,tedge;
  vector<int> brdg,inv;
  void dfs(const vv<int> &g,const vector<pii> &es,int v,int e){
    num[v]=++cnt;
    st.push(v); inS[v]=1; roots.push(v);
    for(const int &i:g[v])if(i!=e){
				int w=es[i].X+es[i].Y-v;
				if(!num[w]){
					dfs(g,es,w,i);
				}else if(inS[w]){
					while(num[roots.top()]>num[w]) roots.pop();
				}
      }
    if(v==roots.top()){
      brdg.pb(e);
      bcc.pb(vector<int>());
      while(1){
				int w=st.top(); st.pop(); inS[w]=0;
				bcc.back().pb(w);
				if(v==w) break;
      }
      roots.pop();
    }
  }
  
  Bcc(vv<int> &g,vector<pii> es){
    const int n=g.size();
    num.resize(n); inS.resize(n);
    int cnt=0;
    rep(i,n)if(!num[i]){
      dfs(g,es,i,-1);
      brdg.pop_back();
    }
    const int m=bcc.size();
    inv.resize(n);
    rep(i,m) for(const int &v:bcc[i]) inv[v]=i;
    for(pii &p:es){p.X=inv[p.X]; p.Y=inv[p.Y];}
    //sort(all(es)); UNIQUE(es);
    tree.resize(m); tedge.resize(m);
    int i=0;
    for(const pii &p:es){
      if(p.X!=p.Y){
				tree[p.X].pb(p.Y);
				tree[p.Y].pb(p.X);
				tedge[p.X].pb(i);
				tedge[p.Y].pb(i);
      }
      ++i;
    }
  }
};

void no(){
	cout<<"NO"<<endl;
	exit(0);
}

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
	string s;
	cin>>s;
	int n=s.size()+1;
	vector<int> a(n);
	rep(i,n-2) a[i+1]=(s[i+1]-s[i]+260)%26;;
	a[0]=s[0]-'a';
	a[n-1]=-(s.back()-'a');
	out(a,1);
	int m;
	cin>>m;
	vector<pii> es(m);
	rep(i,m){
		int x,y;
		cin>>x>>y; --x;
		es[i]=pii(x,y);
	}
	UF uf(n);
	for(pii p:es) uf.unite(p.X,p.Y);
	rep(i,n) uf.unite(i,n-1-i);
	vector<int> ws(n);
	rep(i,n) (ws[uf.root(i)]+=a[i])%=26;
	rep(i,n)if(ws[i]%26) no();
	cout<<"YES"<<endl;
	return 0;
	out(ws,1);

	vv<int> g(n);
	vector<pii> E;
	rep(i,n){
		int j=n-1-i;
		if(i>=j) break;
		int v=uf.root(i);
		int w=uf.root(j);
		if(v>w) swap(v,w);
		if(v!=w) E.eb(v,w);
	}
	sort(all(E)); UNIQUE(E);
	rep(i,E.size()){
		g[E[i].X].pb(i);
		g[E[i].Y].pb(i);
	}
	out(E,g,1);
	Bcc h(g,E);
	vector<int> W(n);
	rep(i,h.bcc.size()){
		auto v=h.bcc[i];
		int s=0;
		for(auto x:v) s+=ws[x];
		W[i]=s;
	}
	int N=h.tree.size();
	out(W,h.tree,1);
	vector<int> vst(N);
	function<int(int,int)> dfs=[&](int v,int p){
		vst[v]=1;
		int s=0;
		for(int w:g[v])if(w!=p) s+=dfs(w,v);
		return (W[v]+s%26)%26;
	};
	rep(i,N)if(!vst[i]){
		auto t=dfs(i,-1);
		out(i,t,1);
		if(t%26) no();
	}
  return 0;
}


Measured memory_bytes: 2384