#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 200 + 13, MAXM = 200 + 13, MAXR = 200 + 13,
                MAXD = 1000 * 1000 * 1000 + 13;
bool diCy(long long hs, long long ts, set<pair<long long, long long> > &dads);
bool mark[MAXR][MAXR], marc[MAXR][MAXR], mard[MAXR][MAXR];
long long dist[MAXR][MAXR], dp[MAXR][MAXR];
queue<pair<long long, long long> > bfsq;
set<pair<long long, long long> > AAA;
vector<pair<long long, long long> > hc, tc, adj[MAXR][MAXR], topo;
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  long long h, t, R;
  cin >> h >> t >> R;
  mark[R + 1][R + 1] = true;
  long long n;
  cin >> n;
  long long a, b;
  hc.push_back(make_pair(0, 0));
  for (long long i = 1; i <= n; i++) {
    cin >> a >> b;
    hc.push_back(make_pair(a, b));
  }
  long long m;
  cin >> m;
  tc.push_back(make_pair(0, 0));
  for (long long i = 1; i <= m; i++) {
    cin >> a >> b;
    tc.push_back(make_pair(a, b));
  }
  long long hp, tp;
  for (long long i = 0; i <= R; i++) {
    for (long long j = 0; j <= R - i; j++) {
      dist[i][j] = MAXD;
      dp[i][j] = 0;
      if (i == j and i == 0) continue;
      for (long long k = 1; k <= min(n, i); k++) {
        hp = i - k + hc[k].first, tp = j + hc[k].second;
        if (hp + tp <= R)
          adj[i][j].push_back(make_pair(hp, tp));
        else
          adj[i][j].push_back(make_pair(R + 1, R + 1));
      }
      for (long long k = 1; k <= m and k <= j; k++) {
        hp = i + tc[k].first, tp = j - k + tc[k].second;
        if (hp + tp <= R)
          adj[i][j].push_back(make_pair(hp, tp));
        else
          adj[i][j].push_back(make_pair(R + 1, R + 1));
      }
    }
  }
  bfsq.push(make_pair(h, t));
  mark[h][t] = true;
  dist[h][t] = 0;
  long long fh = h, ft = t;
  while (!bfsq.empty()) {
    h = bfsq.front().first, t = bfsq.front().second;
    mark[h][t] = true;
    bfsq.pop();
    for (auto i : adj[h][t]) {
      hp = i.first, tp = i.second;
      if (!mark[hp][tp] and hp + tp <= R) {
        dist[hp][tp] = dist[h][t] + 1;
        mark[hp][tp] = true;
        bfsq.push(make_pair(hp, tp));
      }
    }
  }
  if (dist[0][0] < 1000 * 1000 * 1000) {
    cout << "Ivan" << endl << dist[0][0] << endl;
    return 0;
  }
  while (!AAA.empty()) AAA.erase(AAA.begin());
  if (diCy(fh, ft, AAA)) {
    cout << "Draw" << endl;
    return 0;
  }
  reverse(topo.begin(), topo.end());
  for (auto i : topo)
    for (auto j : adj[i.first][i.second])
      dp[j.first][j.second] =
          max(dp[j.first][j.second], dp[i.first][i.second] + 1);
  cout << "Zmey" << endl;
  cout << dp[R + 1][R + 1] << endl;
  return 0;
}
bool diCy(long long hs, long long ts, set<pair<long long, long long> > &dads) {
  bool children = false;
  long long hp, tp;
  dads.insert(make_pair(hs, ts));
  for (auto i : adj[hs][ts]) {
    hp = i.first, tp = i.second;
    if (marc[hp][tp] and dads.find(i) != dads.end())
      children = true;
    else if (!marc[hp][tp]) {
      marc[hp][tp] = true;
      children = children or diCy(hp, tp, dads);
    }
  }
  dads.erase(make_pair(hs, ts));
  topo.push_back(make_pair(hs, ts));
  return children;
}
