/*
        _.-- ,.--.
      .'   .'     /
       @       |'..--------._
     /      \._/              '.
    /  .-.-                     \
   (  /    \                     \
   \\      '.                  | #
    \\       \   -.           /
     :\       |    )._____.'   \
      "       |   /  \  |  \    )
              |   |./'  :__ \.-'
              '--'
*/
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
#define file "b"
#define pb push_back
#define pll pair<ll, ll>
using namespace std;
const ll maxn = 1e6 + 3, maxm = 3e3+2, maxk = 1e4 + 2;
const ll INF = 1e18 + 1;
ll n, m, t = 0, ans = 0,l, r, cnt = 0, k = 0, cur;
bool cn = false;
ll A[maxn], B[maxn];
ll dx[] = {0, 0, -1, 1};
ll dy[] = {1, -1, 0, 0};
vector<pll> v[maxn];
pll p[maxn];
bool _cmp(pll x, pll y){
    return x.second > y.second;
}
void mofile(){
 if(fopen(file".inp", "r")){
     freopen(file".inp", "r", stdin);
freopen(file".out", "w", stdout);
 }
}
void faster(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
}
/*-------------------------------------*/
struct haitay2vumombulozem{
    ll maxx, minn, len, xuong;
}dp[maxm][maxm];
void solve(){
    cin >> n >> m;
   for(int i = 1; i <= n; i++) cin >> A[i];
   for(int i = 1; i <= m; i++) cin >> B[i];
   for(int i = 0; i <= n; i++){
    for(int j = 0; j <= m; j++){
        dp[i][j].minn = -INF;
        dp[i][j].maxx = INF;
        dp[i][j].len = dp[i][j].xuong = 0;
    }
   }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(A[i]==B[j]){
                if(dp[i-1][j-1].minn < A[i]){
                    dp[i][j].maxx = A[i];
                    dp[i][j].len = dp[i-1][j-1].xuong + 1;
                }
                if(dp[i-1][j-1].maxx > A[i]){
                    dp[i][j].minn = A[i];
                    dp[i][j].xuong = dp[i-1][j-1].len + 1;
                }
            }
            else{
                if(dp[i-1][j].len > dp[i][j-1].len){
                    dp[i][j].len = dp[i-1][j].len;
                    dp[i][j].maxx = dp[i-1][j].maxx;
                }
                else if(dp[i-1][j].len < dp[i][j-1].len){
                    dp[i][j].len = dp[i][j-1].len;
                    dp[i][j].maxx = dp[i][j-1].maxx;
                }
                else{
                    dp[i][j].len = dp[i-1][j].len;
                    dp[i][j].maxx = max(dp[i][j-1].maxx, dp[i-1][j].maxx);
                }
                //xuong
                if(dp[i-1][j].xuong > dp[i][j-1].xuong){
                    dp[i][j].xuong = dp[i-1][j].xuong;
                    dp[i][j].minn = dp[i-1][j].minn;
                }
                else if(dp[i-1][j].xuong < dp[i][j-1].xuong){
                    dp[i][j].xuong = dp[i][j-1].xuong;
                    dp[i][j].minn = dp[i][j-1].minn;
                }
                else{
                    dp[i][j].xuong = dp[i-1][j].xuong;
                    dp[i][j].minn = min(dp[i][j-1].minn, dp[i-1][j].minn);
                }
            }
        }
    }
    cout << max(dp[n][m].len, dp[n][m].xuong);
}
/*------------------------------------------*/
main(){
    faster();
    mofile();
    ll tt = 1;
    //cin >> tt;
    while(tt--)
    solve();
}
