/*
“You miss 100% of the shots you don't take”
*/
#define numberOfDecimals(n) \
cout << fixed; \
cout << setprecision(n);
#include <bits/stdc++.h>
#define file \
freopen("lex.in", "r", stdin);
#define ll long long
#define fast \
ios_base::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define testCases \
unsigned ll tests; \
cin >> tests; \
while (tests--)
#define MOD 1000000007LL
using namespace std;
ll add(ll a, ll b)
{
return (((a % MOD + b % MOD) % MOD) + MOD) % MOD;
}
ll mul(ll a, ll b)
{
return (1ll * (a % MOD) * (b % MOD)) % MOD;
}
ll n, m;
string t;
map<char, bool> mp;
ll dp[505][505][26][2];
ll rec(ll it1, ll it2, ll vowel, ll cnt)
{
// cout << it1 << " " << it2 << "\n";
if (cnt * cnt > (n - cnt) || vowel == 2)
return 0;
if (it1 == n)
return (it2 == m);
if (dp[it1][it2][cnt][vowel] != -1)
return dp[it1][it2][cnt][vowel];
ll ans = 0;
bool is_cur_vow = ((it2 < m) && mp[t[it2]]);
ll no_of_vowel = 5, non_vowel = 21;
if (m > it2)
{
ans = rec(it1 + 1, it2 + 1, is_cur_vow ? (vowel + 1) : 0, cnt + is_cur_vow);
if (is_cur_vow)
no_of_vowel--;
else
non_vowel--;
}
ans = add(ans, mul(no_of_vowel, rec(it1 + 1, it2, vowel + 1, cnt + 1)));
ans = add(ans, mul(non_vowel, rec(it1 + 1, it2, 0, cnt)));
return dp[it1][it2][cnt][vowel] = ans;
}
void solve()
{
cin >> n >> m >> t;
memset(dp, -1, sizeof dp);
cout << rec(0, 0, 0, 0);
}
int main()
{
// file;
fast;
mp['a'] = mp['e'] = mp['i'] = mp['o'] = mp['u'] = true;
// testCases
solve();
}
LyoK4oCcWW91IG1pc3MgMTAwJSBvZiB0aGUgc2hvdHMgeW91IGRvbid0IHRha2XigJ0KKi8KI2RlZmluZSBudW1iZXJPZkRlY2ltYWxzKG4pIFwKICAgIGNvdXQgPDwgZml4ZWQ7ICAgICAgICAgIFwKICAgIGNvdXQgPDwgc2V0cHJlY2lzaW9uKG4pOwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBmaWxlIFwKICAgIGZyZW9wZW4oImxleC5pbiIsICJyIiwgc3RkaW4pOwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGZhc3QgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBcCiAgICBjaW4udGllKDApOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgY291dC50aWUoMCk7CiNkZWZpbmUgdGVzdENhc2VzICAgICAgXAogICAgdW5zaWduZWQgbGwgdGVzdHM7IFwKICAgIGNpbiA+PiB0ZXN0czsgICAgICBcCiAgICB3aGlsZSAodGVzdHMtLSkKI2RlZmluZSBNT0QgMTAwMDAwMDAwN0xMCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpsbCBhZGQobGwgYSwgbGwgYikKewogICAgcmV0dXJuICgoKGEgJSBNT0QgKyBiICUgTU9EKSAlIE1PRCkgKyBNT0QpICUgTU9EOwp9CmxsIG11bChsbCBhLCBsbCBiKQp7CiAgICByZXR1cm4gKDFsbCAqIChhICUgTU9EKSAqIChiICUgTU9EKSkgJSBNT0Q7Cn0KCmxsIG4sIG07CnN0cmluZyB0OwoKbWFwPGNoYXIsIGJvb2w+IG1wOwpsbCBkcFs1MDVdWzUwNV1bMjZdWzJdOwoKbGwgcmVjKGxsIGl0MSwgbGwgaXQyLCBsbCB2b3dlbCwgbGwgY250KQp7CiAgICAvLyBjb3V0IDw8IGl0MSA8PCAiICIgPDwgaXQyIDw8ICJcbiI7CiAgICBpZiAoY250ICogY250ID4gKG4gLSBjbnQpIHx8IHZvd2VsID09IDIpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoaXQxID09IG4pCiAgICAgICAgcmV0dXJuIChpdDIgPT0gbSk7CgogICAgaWYgKGRwW2l0MV1baXQyXVtjbnRdW3Zvd2VsXSAhPSAtMSkKICAgICAgICByZXR1cm4gZHBbaXQxXVtpdDJdW2NudF1bdm93ZWxdOwoKICAgIGxsIGFucyA9IDA7CiAgICBib29sIGlzX2N1cl92b3cgPSAoKGl0MiA8IG0pICYmIG1wW3RbaXQyXV0pOwogICAgbGwgbm9fb2Zfdm93ZWwgPSA1LCBub25fdm93ZWwgPSAyMTsKCiAgICBpZiAobSA+IGl0MikKICAgIHsKICAgICAgICBhbnMgPSByZWMoaXQxICsgMSwgaXQyICsgMSwgaXNfY3VyX3ZvdyA/ICh2b3dlbCArIDEpIDogMCwgY250ICsgaXNfY3VyX3Zvdyk7CgogICAgICAgIGlmIChpc19jdXJfdm93KQogICAgICAgICAgICBub19vZl92b3dlbC0tOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm9uX3Zvd2VsLS07CiAgICB9CgogICAgYW5zID0gYWRkKGFucywgbXVsKG5vX29mX3Zvd2VsLCByZWMoaXQxICsgMSwgaXQyLCB2b3dlbCArIDEsIGNudCArIDEpKSk7CiAgICBhbnMgPSBhZGQoYW5zLCBtdWwobm9uX3Zvd2VsLCByZWMoaXQxICsgMSwgaXQyLCAwLCBjbnQpKSk7CgogICAgcmV0dXJuIGRwW2l0MV1baXQyXVtjbnRdW3Zvd2VsXSA9IGFuczsKfQoKdm9pZCBzb2x2ZSgpCnsKICAgIGNpbiA+PiBuID4+IG0gPj4gdDsKCiAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YgZHApOwoKICAgIGNvdXQgPDwgcmVjKDAsIDAsIDAsIDApOwp9CgppbnQgbWFpbigpCnsKICAgIC8vIGZpbGU7CiAgICBmYXN0OwogICAgbXBbJ2EnXSA9IG1wWydlJ10gPSBtcFsnaSddID0gbXBbJ28nXSA9IG1wWyd1J10gPSB0cnVlOwogICAgLy8gdGVzdENhc2VzCiAgICBzb2x2ZSgpOwp9