/*
	JAI JAGANNATH!
*/
//@Author : zanj0

#include<bits/stdc++.h>
using namespace std;

#define int 			long long int

#define ff              first
#define ss              second
#define pb              push_back
#define MOD             1000000007
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define w(x)            int x; cin>>x; while(x--)
#define endl       		"\n"
#define timetaken cerr<<"Time : "<<1000*(long double)clock()/(long double)CLOCKS_PER_SEC<<"ms\n"

void zanj0()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
}
const int MAX = 3e6 + 5;
int fac[MAX], finv[MAX];
int inv[MAX];
void COMinit() {
	fac[0] = fac[1] = 1;
	finv[0] = finv[1] = 1;
	inv[1] = 1;
	for (int i = 2; i < MAX; i++) {
		fac[i] = fac[i - 1] * i % MOD;
		inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
		finv[i] = finv[i - 1] * inv[i] % MOD;
	}
}
int COM(int n, int k) {
	if (n < k) return 0;
	if (n < 0 || k < 0) return 0;
	return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
int add(int a, int b) {
	return ((a % MOD) + (b % MOD)) % MOD;
}
int mul(int a, int b) {
	return ((a % MOD) * (b % MOD)) % MOD;
}
int fastPow(int base, int p) {
	int ret = 1;
	while (p) {
		if (p & 1) ret = mul(ret, base);
		base = mul(base, base);
		p >>= 1;
	}
	return ret;
}
int sub(int a, int b) {
	return (((a % MOD) - (b % MOD)) + MOD) % MOD;
}
void solve() {
	int n, m, k;
	cin >> n >> m >> k;
	COMinit();
	if (n > m + k) {
		cout << 0 << endl;
	} else if (k >= n) {
		cout << COM(n + m, n) << endl;
	} else {
		cout << sub(COM(n + m, n), COM(n + m, m + k + 1)) << endl;
	}

}
int32_t main()
{
	zanj0();
	solve();
	timetaken;
	return 0;
}
#include<bits/stdc++.h>
#define INF 1e9
#define llINF 1e18
#define MOD 1000000007LL
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define ll long long
#define vi vector<ll>
#define vvi vector<vi>
#define SHIFT(n) (1LL<<((ll)n))
#define ALL(a) (a).begin(),(a).end()
#define Max(a) (*max_element(ALL(a)))
#define Min(a) (*min_element(ALL(a)))
#define Sum(a) (accumulate(ALL(a),0LL))
using namespace std;

struct Random{
    random_device rd;
    mt19937 eng;
    uniform_int_distribution<ll> distr;
    uniform_real_distribution<float> distrf;
    Random():eng(rd()),distr(0,INF),distrf(0,1){}
    ll nextInt(ll f, ll t){
        return (distr(eng)%(t-f+1))+f;
    }

    double nextDouble(){
        return (distrf(eng));
    }

    vi next_n_int(ll f, ll t, ll n){
        set<ll> se;
        vi ret;
        while(se.size() < n){
            se.insert(nextInt(f, t));
        }
        for(auto a:se){
            ret.pb(a);
        }
        return ret;
    }
};



vector<vvi> dist(33,vvi(33, vi(4, INF)));
vector<vvi> cd(33,vvi(33, vi(4, INF)));

Random rnd;

ll vx[4] = {1, 0, -1, 0}, vy[4] = {0, 1, 0, -1};
char nc[4] = {'D', 'R', 'U', 'L'};
ll h = 30, w = 30;

bool check(ll x, ll y){
    return x >= 0 && x < h && y >= 0 && y < w;
}

pair<string, ll> make_path(ll si, ll sj, ll ti, ll tj){
    priority_queue<pair<pair<ll,string>,pair<ll,ll>>,vector<pair<pair<ll,string>,pair<ll,ll>>>,greater<>>que;
    que.push(mp(mp(0,""),mp(si,sj)));
    vvi d(33,vi(33,llINF));
    d[si][sj] = 0;
    while(!que.empty()){
        ll ni = que.top().S.F, nj = que.top().S.S;
        ll cost = que.top().F.F;
        string s = que.top().F.S;
        ///cout << ni << " " << nj << endl;
        que.pop();
        if(d[ni][nj] > cost){
            continue;
        }
        if(ni == ti && nj == tj){
            return mp(s, cost);
        }
        for(ll i = 0;i < 4; i++){
            ll nx = ni + vx[i], ny = nj + vy[i];
            if(check(nx, ny)){
                if(d[nx][ny] > cost + dist[ni][nj][i]){
                    d[nx][ny] = cost + dist[ni][nj][i];
                    que.push(mp(mp(d[nx][ny], s+nc[i]),mp(nx, ny)));
                }
            }
        }
    }
}

void solve(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    ll q = 1000;
    while(q--){
        ll si, sj, ti, tj;
        cin >> si >> sj >> ti >> tj;
        pair<string, ll> path = make_path(si, sj, ti, tj);
        cout << path.F << endl;
        flush(cout);
        ll cost;
        cin >> cost;
        ll pcost = path.S;
        ll D = rnd.nextInt(100, 2000);
        ll x = si, y = sj;
        ll sum = 0, cnt = 0, nokori = cost - pcost;
        ll psize = path.F.size();
        ll gap = nokori/psize;
        for(auto c:path.F){
            //DRUL
            if(c == 'U'){
                dist[x][y][2] = dist[x-1][y][0] = max(1000+D, dist[x][y][2] + gap);
                x--;
            }else if(c == 'D'){
                dist[x][y][0] = dist[x+1][y][2] = max(1000+D, dist[x][y][0] + gap);
                x++;
            }else if(c == 'R'){
                dist[x][y][1] = dist[x][y+1][3] = max(1000+D, dist[x][y][1] + gap);
                y++;
            }else{
                dist[x][y][3] = dist[x][y-1][1] = max(1000+D, dist[x][y][3] + gap);
                y--;
            }
        }
    }
    return;
}

int main(){
    solve();
    return 0;
}