#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;
}