#include <bits/stdc++.h>
#ifndef ONLINE_JUDGE
#include "debug.h"
#else
#define debug(...)
#endif
#define int long long
#define oo LLONG_MAX >> 2
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()
#define pep_Guardiola \
ios::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0);
using namespace std;
void io()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
}
int skip(int m, int st, const vector<int>&moves){
int pos = st, skips = 0;
for(auto x : moves){
if(pos+m > m || pos+m < 1) skips++;
else pos=pos+m;
}
return skips;
}
int ternary(int m, const vector<int>&moves){
if(moves.empty()) return 0;
int l = 1, r = m;
while(r-l > 2){
int mid1 = l + (r-l)/3;
int mid2 = r - (r-l)/3;
int f1 = skip(m, mid1, moves);
int f2 = skip(m, mid2, moves);
if(f1 < f2) r = mid2;
else if(f1 > f2) l = mid1;
else l = mid1, r = mid2;
}
int mn = skip(m, l, moves);
for(int i = l+1; i <= r; i++){
mn = min(mn, skip(mn, i, moves));
}
return mn;
}
void Guardiola()
{
int r, c; string s;
cin >> r >> c >> s;
vector<int> v, h;
for(int i = 0; i < s.length(); i++){
if(s[i] == '>') v.push_back(1);
if (s[i] == '<') v.push_back(-1);
if(s[i] == 'v') v.push_back(1);
if(s[i] == '^') h.push_back(-1);
}
int mn1 = ternary(r, v);
int mn2 = ternary(c, h);
cout << mn1+ mn2 << endl;
}
signed main()
{
pep_Guardiola;
io();
int t = 1;
cin >> t;
while (t--)
Guardiola();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpZm5kZWYgT05MSU5FX0pVREdFCiNpbmNsdWRlICJkZWJ1Zy5oIgojZWxzZQojZGVmaW5lIGRlYnVnKC4uLikKI2VuZGlmCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIG9vIExMT05HX01BWCA+PiAyCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIGFsbHIoeCkgeC5yYmVnaW4oKSwgeC5yZW5kKCkKI2RlZmluZSBwZXBfR3VhcmRpb2xhICAgICAgXAogIGlvczo6c3luY193aXRoX3N0ZGlvKDApOyBcCiAgY2luLnRpZSgwKTsgICAgICAgICAgICAgIFwKICBjb3V0LnRpZSgwKTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgaW8oKQp7CiNpZm5kZWYgT05MSU5FX0pVREdFCiAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgLy8gZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKI2VuZGlmCn0KCmludCBza2lwKGludCBtLCBpbnQgc3QsIGNvbnN0IHZlY3RvcjxpbnQ+Jm1vdmVzKXsKICBpbnQgcG9zID0gc3QsIHNraXBzID0gMDsKICBmb3IoYXV0byB4IDogbW92ZXMpewogICAgaWYocG9zK20gPiBtIHx8IHBvcyttIDwgMSkgc2tpcHMrKzsKICAgIGVsc2UgcG9zPXBvcyttOwogIH0KICByZXR1cm4gc2tpcHM7Cn0KCmludCB0ZXJuYXJ5KGludCBtLCBjb25zdCB2ZWN0b3I8aW50PiZtb3Zlcyl7CiAgaWYobW92ZXMuZW1wdHkoKSkgcmV0dXJuIDA7CiAgaW50IGwgPSAxLCByID0gbTsKICB3aGlsZShyLWwgPiAyKXsKICAgIGludCBtaWQxID0gbCArIChyLWwpLzM7CiAgICBpbnQgbWlkMiA9IHIgLSAoci1sKS8zOwogICAgaW50IGYxID0gc2tpcChtLCBtaWQxLCBtb3Zlcyk7CiAgICBpbnQgZjIgPSBza2lwKG0sIG1pZDIsIG1vdmVzKTsKICAgIGlmKGYxIDwgZjIpIHIgPSBtaWQyOwogICAgZWxzZSBpZihmMSA+IGYyKSBsID0gbWlkMTsKICAgIGVsc2UgbCA9IG1pZDEsIHIgPSBtaWQyOwogIH0KICBpbnQgbW4gPSBza2lwKG0sIGwsIG1vdmVzKTsKICBmb3IoaW50IGkgPSBsKzE7IGkgPD0gcjsgaSsrKXsKICAgIG1uID0gbWluKG1uLCBza2lwKG1uLCBpLCBtb3ZlcykpOwogIH0KICByZXR1cm4gbW47Cn0KCnZvaWQgR3VhcmRpb2xhKCkKewogIGludCByLCBjOyBzdHJpbmcgczsKICBjaW4gPj4gciA+PiBjID4+IHM7CiAgdmVjdG9yPGludD4gdiwgaDsKICBmb3IoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKXsKICAgIGlmKHNbaV0gPT0gJz4nKSB2LnB1c2hfYmFjaygxKTsKICAgIGlmIChzW2ldID09ICc8Jykgdi5wdXNoX2JhY2soLTEpOwogICAgaWYoc1tpXSA9PSAndicpIHYucHVzaF9iYWNrKDEpOwogICAgaWYoc1tpXSA9PSAnXicpIGgucHVzaF9iYWNrKC0xKTsKICB9CiAgaW50IG1uMSA9IHRlcm5hcnkociwgdik7CiAgaW50IG1uMiA9IHRlcm5hcnkoYywgaCk7CiAgY291dCA8PCBtbjErIG1uMiA8PCBlbmRsOwp9CgpzaWduZWQgbWFpbigpCnsKICBwZXBfR3VhcmRpb2xhOwogIGlvKCk7CiAgaW50IHQgPSAxOwogIGNpbiA+PiB0OwogIHdoaWxlICh0LS0pCiAgICBHdWFyZGlvbGEoKTsKICByZXR1cm4gMDsKfQ==