#include <bits/stdc++.h>
// iostream is too mainstream
#include <cstdio>
// bitch please
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <cmath>
#include <iomanip>
#include <time.h>
#define dibs reserve
#define OVER9000 1234567890
#define ALL_THE(CAKE,LIE) for(auto LIE =CAKE.begin(); LIE != CAKE.end(); LIE++)
#define tisic 47
#define soclose 1e-8
#define chocolate win
// so much chocolate
#define patkan 9
#define ff first
#define ss second
#define abs(x) ((x < 0)?-(x):x)
#define uint unsigned int
#define dbl long double
#define pi 3.14159265358979323846
using namespace std;
// mylittledoge

typedef long long cat;

#ifdef DONLINE_JUDGE
	// palindromic tree is better than splay tree!
	#define lld I64d
#endif

cat mod =1000000007;

map< vector<int>, int > M;
vector< vector<int> > Mi;
vector<int> cnt[71];

int MX =70;

void put(vector<int> &seq, int x) {
	for(int i =(int)seq.size()-1; i >= 0; i--) if(seq[i] >= x) {
		seq.insert(begin(seq)+i+1,x);
		return;
	}
	seq.insert(begin(seq),x);
}

int get_id(vector<int> &seq) {
	auto it =M.find(seq);
	if(it == M.end()) {
		int m =M.size();
		M[seq] =m;
		Mi.push_back(seq);
		return m;
	}
	return it->ss;
}

void dump(int id, int sum, cat cnt_cur) {
	if(id >= (int)cnt[sum].size())
		cnt[sum].resize(id+1,0);
	cnt[sum][id] +=cnt_cur;
	if(cnt[sum][id] >= mod) cnt[sum][id] -=mod;
}

void push(int id, int sum, cat cnt_cur) {
	vector<int> seq =Mi[id];
	// add 0
	int sum_nw =sum+int(!seq.empty())+1;
	seq.push_back(0);
	int id_nw =get_id(seq);
	if(sum_nw <= MX) dump(id_nw,sum_nw,cnt_cur);
	// add non-0
	int a =seq.size()-1;
	for(int i =1; i < 100; i++) {
		if(sum_nw > MX) break;
		seq[a]++;
		while(a > 0 && seq[a-1] < seq[a]) {
			swap(seq[a],seq[a-1]);
			a--;
		}
		id_nw =get_id(seq);
		dump(id_nw,sum_nw,cnt_cur);
		sum_nw +=2;
	}
}

int main() {
	cin.sync_with_stdio(0);
	cin.tie(0);
	cout << fixed << setprecision(10);

	Mi.resize(1);
	M[vector<int>()] =0;
	cnt[0].resize(1,1);
	int st =0;
	for(int i =0; i < MX; i++) {
		int st_nw =M.size();
		for(int sum =MX; sum >= 0; sum--)
			for(int l =st; l < (int)cnt[sum].size(); l++) if(cnt[sum][l])
				push(l,sum,cnt[sum][l]);
		st =st_nw;
	}
	cat C[200][200];
	memset(C,0,sizeof(C));
	for(int i =0; i < 200; i++) {
		C[i][0] =1;
		for(int j =1; j <= i; j++) C[i][j] =(C[i-1][j]+C[i-1][j-1])%mod;
	}

	int N,K;
	string S;
	cin >> N >> K >> S;

	int ans =0;
	for(int sum =0; sum <= N; sum++) for(int i =0; i < (int)cnt[sum].size(); i++) {
		if(cnt[sum][i] == 0) continue;
		vector<int> seq =Mi[i];

		int a =0, b =0, c =0;
		vector<int> seqb;
		for(int i =0; i < K; i++) {
			if(S[i] == 'r') {
				if(a < (int)seq.size()) {
					if(seq[a]) seqb.push_back(seq[a]);
					a++;
				}
				else
					if(b > 0) b--;
			}
			else {
				if(c < (int)seqb.size()) {
					b +=seqb[c];
					c++;
				}
				if(b > 0) b--;
			}
		}
		if(a < (int)seq.size() || c < (int)seqb.size() || b > 0) continue;

		int buckets =seq.size()+1;
		ALL_THE(seq,it) buckets +=2*(*it)+1;
		cat cnt_ins =C[N-sum+buckets-1][buckets-1];

		ans =(ans+cnt[sum][i]*cnt_ins)%mod;
	}

	ans %=mod;
	if(ans < 0) ans +=mod;
	cout << ans << "\n";
	return 0;}

// look at my code
// my code is amazing


Measured memory_bytes: 172840