#include <bits/stdc++.h>
using namespace std;
const int maxn = 2222, mod = 998244353;
inline long long read() {
  char ch = getchar();
  long long x = 0, f = 0;
  while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return f ? -x : x;
}
inline int qmo(int x) { return x + (x >> 31 ? mod : 0); }
int n, m1, m2;
struct twosat {
  bitset<maxn> e[maxn];
  int in[maxn];
  inline void add(int u, int v) { e[u][v] = true; }
  void floyd() {
    for (int i = (2); i <= (2 * n + 1); i++) e[i][i] = true;
    for (int k = (2); k <= (2 * n + 1); k++)
      for (int i = (2); i <= (2 * n + 1); i++)
        if (e[i][k]) e[i] |= e[k];
  }
  void work() {
    floyd();
    for (int i = (2); i <= (2 * n + 1); i++)
      if (e[i][i ^ 1])
        for (int j = (2); j <= (2 * n + 1); j++) add(i, j), add(j, i ^ 1);
    floyd();
  }
  void dfs(int u) {
    if (in[u]) return;
    in[u] = 1;
    in[u ^ 1] = -1;
    for (int v = (2); v <= (2 * n + 1); v++)
      if (e[u][v]) dfs(v);
  }
  void solve(int x, int y) {
    dfs(x);
    dfs(y);
    for (int i = (1); i <= (n); i++)
      if (!in[2 * i]) {
        if (e[2 * i][2 * i + 1])
          dfs(2 * i + 1);
        else
          dfs(2 * i);
      }
    for (int i = (1); i <= (n); i++) printf("%d ", in[2 * i] == 1 ? 0 : 1);
  }
} f, g;
int main() {
  n = read();
  m1 = read();
  m2 = read();
  while (m1--) {
    int u = read(), v = read();
    u = u > 0 ? 2 * u : -2 * u + 1;
    v = v > 0 ? 2 * v : -2 * v + 1;
    f.add(u, v ^ 1);
    f.add(v, u ^ 1);
  }
  f.work();
  while (m2--) {
    int u = read(), v = read();
    u = u > 0 ? 2 * u : -2 * u + 1;
    v = v > 0 ? 2 * v : -2 * v + 1;
    g.add(u, v ^ 1);
    g.add(v, u ^ 1);
  }
  g.work();
  for (int i = (2); i <= (2 * n + 1); i++)
    for (int j = (2); j <= (2 * n + 1); j++)
      if (f.e[i][j] ^ g.e[i][j] && i != j) {
        if (f.e[i][j])
          return g.solve(i, j ^ 1), 0;
        else
          return f.solve(i, j ^ 1), 0;
      }
  puts("SIMILAR");
}
