#include <bits/stdc++.h>
using namespace std;
const int M = 1e9 + 7;
const int MOD = 1e9 + 7;
const double PI = 3.141592653589793238460;
long long power(long long a, long long b) {
  long long res = 1;
  if (a == 0) return 0;
  if (a == 1) return 1;
  for (; b > 0; b >>= 1) {
    if (b & 1) res = (res * a);
    if (res > MOD) res %= MOD;
    a = (a * a);
    if (a > MOD) a = a % MOD;
  }
  return res;
}
bool isPrime[1000000 + 1];
vector<long long> prime;
void seive(int limit) {
  isPrime[0] = isPrime[1] = 1;
  for (int i = 2; i * i <= limit; i++) {
    if (!isPrime[i])
      for (int j = i * i; j <= limit; j += i) {
        isPrime[j] = 1;
      }
  }
  for (int i = 2; i <= limit; i++)
    if (!isPrime[i]) prime.push_back(i);
}
vector<int> v[26];
int dp[5001][5001];
int recur(int a, int b, string s, string t) {
  if (dp[a][b] != -1) return dp[a][b];
  if (a == s.size()) return 0;
  if (b == t.size()) return 0;
  int tot = 0;
  tot += recur(a, b + 1, s, t);
  tot %= M;
  if (s[a] == t[b]) {
    tot += recur(a + 1, b + 1, s, t) + 1;
    tot %= M;
  }
  return dp[a][b] = tot;
}
void solve() {
  string s;
  string t;
  cin >> s >> t;
  for (int i = 0; i <= s.length(); i++)
    for (int j = 0; j <= t.length(); j++) dp[i][j] = 0;
  int rs = 0;
  for (int i = s.length() - 1; i >= 0; i--) {
    for (int j = t.length() - 1; j >= 0; j--) {
      if (s[i] == t[j]) {
        dp[i][j] = dp[i + 1][j + 1] + 1;
        if (dp[i][j] > M) dp[i][j] %= M;
      }
      dp[i][j] += dp[i][j + 1];
      dp[i][j] %= M;
    }
  }
  for (int i = 0; i < s.length(); i++) {
    rs = (rs + dp[i][0]) % M;
  }
  cout << rs;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0);
  int tt;
  tt = 1;
  while (tt--) {
    solve();
  }
}
