#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18 + 5;
const long long MAX_N = 1e3 + 5;
const long long MODD = 1e9 + 7;
const long double PI = 3.14159265358979323846;
long long max(long long a, long long b) { return a > b ? a : b; }
long long min(long long a, long long b) { return a < b ? a : b; }
double max(double a, double b) { return a > b ? a : b; }
double min(double a, double b) { return a < b ? a : b; }
long long modd(long long a) {
  if (a < 0LL) return a * -1LL;
  return a;
}
long double modd(long double a) {
  if (a < 0.0) return a * -1.0;
  return a;
}
long long modulo(long long a) { return (a + MODD) % MODD; }
long long power(long long k, long long p) {
  if (p == 0) return 1LL;
  long long P = power(k, p / 2LL);
  P = (P * P) % MODD;
  if (p % 2 == 1) P = (P * k) % MODD;
  return P;
}
void solve() {
  long long n, m;
  cin >> n >> m;
  string a, b;
  cin >> a >> b;
  long long dp[n + 5][m + 5];
  memset(dp, 0, sizeof(dp));
  long long ans = 0LL;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      long long t = 0;
      if (i > 0) {
        t = max(t, dp[i - 1][j] - 1);
      }
      if (j > 0) {
        t = max(t, dp[i][j - 1] - 1);
      }
      dp[i][j] = max(0, t);
      t = 0;
      if (i > 0 && j > 0) {
        t = dp[i - 1][j - 1];
      }
      if (a[i] == b[j]) {
        dp[i][j] = max(dp[i][j], t + 2);
      }
      ans = max(dp[i][j], ans);
    }
  }
  cout << ans << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long t = 1;
  for (long long i = 0; i < t; i++) {
    solve();
  }
  return 0;
}
