Little Artem is a very smart programmer. He knows many different difficult algorithms. Recently he has mastered in 2-SAT one.

In computer science, 2-satisfiability (abbreviated as 2-SAT) is the special case of the problem of determining whether a conjunction (logical AND) of disjunctions (logical OR) have a solution, in which all disjunctions consist of no more than two arguments (variables). For the purpose of this problem we consider only 2-SAT formulas where each disjunction consists of exactly two arguments.

Consider the following 2-SAT problem as an example: <image>. Note that there might be negations in 2-SAT formula (like for x1 and for x4).

Artem now tries to solve as many problems with 2-SAT as possible. He found a very interesting one, which he can not solve yet. Of course, he asks you to help him. 

The problem is: given two 2-SAT formulas f and g, determine whether their sets of possible solutions are the same. Otherwise, find any variables assignment x such that f(x) ≠ g(x). 

Input

The first line of the input contains three integers n, m1 and m2 (1 ≤ n ≤ 1000, 1 ≤ m1, m2 ≤ n2) — the number of variables, the number of disjunctions in the first formula and the number of disjunctions in the second formula, respectively.

Next m1 lines contains the description of 2-SAT formula f. The description consists of exactly m1 pairs of integers xi ( - n ≤ xi ≤ n, xi ≠ 0) each on separate line, where xi > 0 corresponds to the variable without negation, while xi < 0 corresponds to the variable with negation. Each pair gives a single disjunction. Next m2 lines contains formula g in the similar format.

Output

If both formulas share the same set of solutions, output a single word "SIMILAR" (without quotes). Otherwise output exactly n integers xi (<image>) — any set of values x such that f(x) ≠ g(x).

Examples

Input

2 1 1
1 2
1 2


Output

SIMILAR


Input

2 1 1
1 2
1 -2


Output

0 0 

Note

First sample has two equal formulas, so they are similar by definition.

In second sample if we compute first function with x1 = 0 and x2 = 0 we get the result 0, because <image>. But the second formula is 1, because <image>.
#include <bits/stdc++.h>
using namespace std;
int x1, x2, x3;
struct graph {
  int n, m, tot;
  bitset<2200> a[2200];
  inline int hash(int x) {
    if (x > 0) return x * 2;
    if (x < 0) return (-x) * 2 + 1;
  }
  inline void closure() {
    for (int i = 2; i <= tot; i++) {
      for (int j = 2; j <= tot; j++) {
        if (a[j][i]) a[j] |= a[i];
      }
    }
  }
  inline void init() {
    tot = n + n + 1;
    for (int i = 1; i <= m; i++) {
      scanf("%d %d", &x1, &x2);
      x1 = hash(x1);
      x2 = hash(x2);
      a[x2 ^ 1].set(x1);
      a[x1 ^ 1].set(x2);
    }
    for (int i = 2; i <= tot; i++) {
      a[i].set(i);
    }
    closure();
  }
  inline void solve() {
    for (int i = 2; i <= tot; i++) {
      if (a[i][i ^ 1]) {
        for (int j = 2; j <= tot; j++) {
          a[i].set(j);
          a[j].set(i ^ 1);
        }
      }
    }
    closure();
  }
  int ans[2200];
  inline void color(int x) {
    ans[x] = 1;
    ans[x ^ 1] = 0;
    for (int i = 2; i <= tot; i++) {
      if (a[x][i]) {
        if (ans[i] == -1) color(i);
      }
    }
  }
  inline void print(int tr, int fa) {
    memset(ans, -1, sizeof(ans));
    fa = (fa ^ 1);
    color(tr);
    if (ans[fa] == -1) color(fa);
    for (int i = 2; i <= tot; i++) {
      if (!a[i][i ^ 1] && (ans[i] == -1)) {
        color(i);
      }
    }
    for (int i = 1; i <= n; i++) printf("%d ", ans[i * 2]);
  }
} g[2];
int main() {
  scanf("%d %d %d", &x1, &x2, &x3);
  g[0].n = g[1].n = x1;
  g[0].m = x2;
  g[1].m = x3;
  g[0].init();
  g[1].init();
  g[0].solve();
  g[1].solve();
  for (int i = 2; i <= g[0].tot; i++) {
    for (int j = 2; j <= g[0].tot; j++) {
      if (g[0].a[i][j] != g[1].a[i][j]) {
        if (g[0].a[i][j] == 1) {
          g[1].print(i, j);
        } else {
          g[0].print(i, j);
        }
        return 0;
      }
    }
  }
  printf("SIMILAR\n");
  return 0;
}
