func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2005;   bool can = 1;   char arr[N][N];   int n, m, vis[N][N], dp[N][N];   bool valid(pair<int, int> a) {     return min(a.first, a.second) > -1 && a.first < n && a.second < m &&            arr[a.first][a.second] !=  # ;   }   pair<int, int> get_next(pair<int, int> a) {     if (arr[a.first][a.second] ==  < ) return {a.first, a.second - 1};     if (arr[a.first][a.second] ==  > ) return {a.first, a.second + 1};     if (arr[a.first][a.second] ==  ^ ) return {a.first - 1, a.second};     return {a.first + 1, a.second};   }   void dfs(pair<int, int> u) {     vis[u.first][u.second] = 1;     pair<int, int> c = get_next(u);     if (valid(c)) {       if (vis[c.first][c.second] == 0)         dfs(c);       else if (vis[c.first][c.second] == 1) {         can = 0;         return;       }     }     vis[u.first][u.second] = 2;   }   bool go(pair<int, int> u) {     vis[u.first][u.second] = 1;     pair<int, int> c = get_next(u);     bool ret = 1;     if (valid(c)) {       if (vis[c.first][c.second] == 0)         ret &= go(c);       else         ret = 0;     }     return ret;   }   int solve(pair<int, int> u) {     if (!valid(u)) return 0;     if (~dp[u.first][u.second]) return dp[u.first][u.second];     pair<int, int> c = get_next(u);     return dp[u.first][u.second] = solve(c) + 1;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> n >> m;     memset(dp, -1, sizeof(dp));     for (int i = 0; i < n; ++i)       for (int j = 0; j < m; ++j) cin >> arr[i][j];     for (int i = 0; i < n; ++i)       for (int j = 0; j < m; ++j)         if (!vis[i][j] && valid({i, j})) dfs({i, j});     if (can) {       vector<pair<int, pair<int, int>>> v;       for (int i = 0; i < n; ++i)         for (int j = 0; j < m; ++j) v.push_back({solve({i, j}), {i, j}});       sort(v.rbegin(), v.rend());       if (v.size() == 1 || v[0].first == 0)         cout << v[0].first;       else {         int ans1 = v[0].first, ans2 = v[0].first - 1;         memset(vis, 0, sizeof(vis));         go(v[0].second);         for (int i = 1; i < v.size(); ++i) {           if (v[i].first < v[i - 1].first) break;           if (go(v[i].second)) {             ans2 = ans1;             break;           }         }         cout << ans1 + ans2;       }     } else       cout << -1;     return 0;   }   