There are N squares numbered 1 to N from left to right. Each square has a character written on it, and Square i has a letter s_i. Besides, there is initially one golem on each square.

Snuke cast Q spells to move the golems.

The i-th spell consisted of two characters t_i and d_i, where d_i is `L` or `R`. When Snuke cast this spell, for each square with the character t_i, all golems on that square moved to the square adjacent to the left if d_i is `L`, and moved to the square adjacent to the right if d_i is `R`.

However, when a golem tried to move left from Square 1 or move right from Square N, it disappeared.

Find the number of golems remaining after Snuke cast the Q spells.

Constraints

* 1 \leq N,Q \leq 2 \times 10^{5}
* |s| = N
* s_i and t_i are uppercase English letters.
* d_i is `L` or `R`.

Input

Input is given from Standard Input in the following format:


N Q
s
t_1 d_1
\vdots
t_{Q} d_Q


Output

Print the answer.

Examples

Input

3 4
ABC
A L
B L
B R
A R


Output

2


Input

8 3
AABCBDBA
A L
B R
A R


Output

5


Input

10 15
SNCZWRCEWB
B R
R R
E R
W R
Z L
S R
Q L
W L
B R
C L
A L
N L
E R
Z L
S L


Output

3
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
	private class Move {
		public char alpha;
		public char move;
		public Move(String alpha, String move) {
			this.alpha = alpha.charAt(0);
			this.move = move.charAt(0);
		}
	}
	
	private char getAlpha(String s, int index) {
		if (index < 0 || index >= s.length()) {
			return ' ';
		} else {
			return s.charAt(index);
		}
	}
	
	private int calcDropNum(String s, LinkedList<Move> moves, char left) {
		int pos = -1;
		
		for (Move move : moves) {
			if (move.move == left) {
				char srcAlpha = getAlpha(s, pos+1);
				if (srcAlpha == move.alpha) {
					pos++;
				}
			} else {
				// move right
				char srcAlpha = getAlpha(s, pos-1);
				char nowAlpha = getAlpha(s, pos);
				if (nowAlpha != move.alpha) {
					// do nothing.
				//} else if (srcAlpha == move.alpha) {
				} else {
						pos--;
				}
			}
		}
		
		return pos+1;
	}
	
	public void solve() {
		Scanner in = new Scanner(System.in);
		in.nextInt();
		int Q = in.nextInt();
		String s = in.next();
		
		LinkedList<Move> moves = new LinkedList<Move>();
		for (int i=0; i<Q; i++) {
			moves.addFirst(new Move(in.next(), in.next()));
		}
		in.close();
		
		int dropLeft = calcDropNum(s, moves, 'L');
		
		String invS = (new StringBuffer(s)).reverse().toString();
		int dropRight = calcDropNum(invS, moves, 'R');
		
		int totalDrop = Math.min(s.length(), dropLeft+dropRight);
		
		System.out.println(s.length() - totalDrop);
	}
	
	public void solve2() {
		Scanner in = new Scanner(System.in);
		in.nextInt();
		int Q = in.nextInt();
		String s = in.next();
		int[] nums = new int[s.length()];
		Arrays.fill(nums, 1);
		
		for (int i=0; i<Q; i++) {
			char alpha = in.next().charAt(0);
			char move = in.next().charAt(0);

			if (move == 'L') {
				for (int j=0; j<s.length(); j++) {
					if (s.charAt(j) == alpha) {
						if (j-1 >= 0) {
							nums[j-1] += nums[j];
						}
						nums[j] = 0;
					}
				}
			} else {
				for (int j=s.length()-1; j>=0; j--) {
					if (s.charAt(j) == alpha) {
						if (j+1 <= s.length()-1) {
							nums[j+1] += nums[j];
						}
						nums[j] = 0;
					}
				}
			}
		}
		in.close();

		System.out.println(sum(nums));
	}

	private int sum(int[] nums) {
		int sum = 0;
		for (int i=0; i<nums.length; i++) {
			sum += nums[i];
		}
		return sum;
	}
	
	public static void main(String[] args) {
		Main main = new Main();
		main.solve();
	}
}
