#include <iostream>
using namespace std;
using ll=long long;
long long modpow(long long a, long long n, long long mod) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}
int main(){
  ll MOD=1000000000+7;
  ll N,P;cin>>N>>P;
  ll res=P-1;
  res*=modpow(P-2,N-1,MOD);
 
  res=res%MOD;
  cout<<res<<endl;
}
//ll __(){
//    _(int,n);
//    _(string,s);
//    _(string,t);
//    vi a,b;
//    rep(i,n){
//        if(s[i] == '1')
//            a.pb(i);
//        if(t[i] == '1')
//            b.pb(i);
//    }
//    vi erase;
//    ll ans = 0;
//    int l = 0;
//    rep(i,sz(a)){
//        if(l < sz(b) && a[i] >= b[l]){
//            ans += a[i]-b[l];
//            ++l;
//        }
//        else
//            erase.pb(a[i]);
//    }
//    if(l < sz(b) || sz(erase)%2)
//        return -1;
//    for(int i = 0; i < sz(erase); i += 2)
//        ans += abs(erase[i]-erase[i+1]);
//    return ans;
//}
//
#include <iomanip>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define pb push_back
#define REP_ZERO_INT(i,r) for(int i = 0; i < (r); ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT,REP_ZERO_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef vector<int> vi;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
#define INPUT_WITHOUT_INIT(type,name) type name; cin >> name
#define GET_INPUT_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define _(...) GET_INPUT_MACRO(__VA_ARGS__,_IWI,_IWI,_IWI,_IWI,_IWI,_IWI,INPUT_WITHOUT_INIT)(__VA_ARGS__)
ll __(){
    _(int,n);
    _(string,s);
    _(string,t);
    vi a,b;
    rep(i,n){
        if(s[i] == '1')
            a.pb(i);
        if(t[i] == '1')
            b.pb(i);
    }
    vi erase;
    ll ans = 0;
    int l = 0;
    rep(i,sz(a)){
        if(l < sz(b) && a[i] >= b[l]){
            ans += a[i]-b[l];
            ++l;
        }
        else
            erase.pb(a[i]);
    }
    if(l < sz(b) || sz(erase)%2)
        return -1;
    for(int i = 0; i < sz(erase); i += 2)
        ans += abs(erase[i]-erase[i+1]);
    return ans;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        cout << __() << '\n';
}

