#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
using namespace std;
const int mod = 1e9 + 7;
inline char gt()
{
static char buf[1 << 21], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
inline void rs(string &s)
{
register char ch = gt();
while(ch >= '1' && ch <= '9') s += ch, ch = gt();
}
template <typename T>
inline void read(T &x)
{
register char ch = gt();
x = 0;
int w(0);
while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x)
{
if(x < 0) x = -x, putchar('-');
char ch[20];
int num(0);
while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
while(num) putchar(ch[num--]);
putchar('\n');
}
struct matrix
{
int n, m;
int c[3][3];
matrix()
{
memset(c, 0, sizeof c);
}
} A, base;
int a, b, c, d;
matrix operator * (matrix x, matrix y)
{
matrix c;
c.n = x.n;
c.m = y.m;
rep(i, 1, x.n)
rep(j, 1, y.n)
rep(k, 1, x.m)
c.c[i][j] = (c.c[i][j] + 1ll * x.c[i][k] * y.c[k][j] % mod) % mod;
return c;
}
inline matrix qpow (matrix a, int k)
{
matrix ans;
ans.n = a.n;
ans.m = a.m;
rep(i, 1, a.n) ans.c[i][i] = 1;
while(k)
{
if(k & 1) ans = ans * a;
a = a * a;
k >>= 1;
}
return ans;
}
int main()
{
string nn, mm;
rs(nn);
rs(mm);
read(a);
read(b);
read(c);
read(d);
int n = 0, m = 0;
int P = mod - 1;
if(a == 1) P++;
int lenn = nn.size() - 1, lenm = mm.size() - 1;
rep(i, 0, lenn)
n = (n * 10 + (nn[i] - '0') ) % P;
rep(i, 0, lenm)
m = (m * 10 + (mm[i] - '0') ) % P;
base.n=base.m=2;
A.n = A.m = 2;
base.c[1][1] = a;
base.c[2][1] = b;
base.c[2][2] = 1;
A = qpow(base, m - 1);
base.c[1][1] = c;
base.c[2][1] = d;
base.c[2][2] = 1;
base = A * base;
A = (qpow(base, n - 1) * A);
matrix chu;
chu.n = 1;
chu.m = 2;
chu.c[1][1] = chu.c[1][2] = 1;
chu = chu * A;
out(chu.c[1][1] % mod);
}