# _*_ coding:utf-8 _*_
#  Atcoder_Exawizards2019_Contest-C
#  https://exawizards2019.contest.atcoder.jp/tasks/exawizards2019_c
#  cf http://drken1215.hatenablog.com/entry/2019/04/01/165200

import logging
from logging import getLogger, StreamHandler, Formatter

# --------------------------------
# 1.loggerの設定
# --------------------------------
# loggerオブジェクトの宣言
logger = getLogger("LogTest")

# loggerのログレベル設定(ハンドラに渡すエラーメッセージのレベル)
logger.setLevel(logging.DEBUG)

# --------------------------------
# 2.handlerの設定
# --------------------------------
# handlerの生成
stream_handler = StreamHandler()

# handlerのログレベル設定(ハンドラが出力するエラーメッセージのレベル)
stream_handler.setLevel(logging.DEBUG)

# ログ出力フォーマット設定
handler_format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(handler_format)

# --------------------------------
# 3.loggerにhandlerをセット
# --------------------------------
logger.addHandler(stream_handler)

def simulate(positionString,actionList,firstposition):
	# ある位置のゴーレムに対してactionListを行ったところどこへ行くかを調査する
	# 定数として呪文で示される位置＋方向情報を設定する
	COMMANDPLACE = 0
	COMMANDWAY = 1
	position = firstposition
	actionCount = len(actionList)
	for i in range(0,actionCount,+1):
		wizardCommand = actionList[i]
		# print("wizardCommand is {}".format(wizardCommand))
		# もし位置情報の文字と一致していたら方向へプラス
		# print("Now i is {}".format(actionList[i]))
#		logger.debug("{}番目の呪文を唱えます".format(i))
		wizardPointPlaceStr = wizardCommand[COMMANDPLACE]
		nowPositionStr = positionString[position]
		if wizardPointPlaceStr != nowPositionStr:
#			logger.debug("呪文指定位置{} != 現在の位置({}番目)情報{}なので動きません".format(wizardPointPlaceStr,position,nowPositionStr))
			# このコマンドでは動かないためスルーする
			continue
		else:
			if wizardCommand[COMMANDWAY] == 'L':
#				logger.debug(
#					"呪文指定位置{} != 現在の位置({}番目)情報{}なので←に動きます".format(wizardPointPlaceStr, position, nowPositionStr))
				position = position -1
			else:
#				logger.debug(
#					"呪文指定位置{} != 現在の位置({}番目)情報{}なので→に動きます".format(wizardPointPlaceStr, position, nowPositionStr))
				position = position + 1
		if position < 0 :
			return -1
		if len(positionString) -1 < position:
			return 1
	return 0

def solveProblem(N,Q,positionString,actionList):
#	pos = (-1 + N)/2
	counter = 0
	for position in range(0,N,+1):
		simresult = simulate(positionString,actionList,position)
		if simresult == 1:
#			print("{} に 合ったゴーレムは右に落ちました".format(position))
			counter = counter + 1
		elif simresult == -1 :
#			print("{} に あったゴーレムは左に落ちました".format(position))
			counter = counter + 1
	answer = N-counter
	return answer


if __name__ == '__main__':
	N,Q = map(int,input().strip().split(' '))
	s = input().strip()
	actionList=[input().strip().split(' ') for _ in range(0,Q,+1)]
	solution = solveProblem(N,Q,s,actionList)
	print("{}".format(solution))
