#include <bits/stdc++.h>
using namespace std;
int n;
int ans[2010];
struct _2sat {
  bitset<2010> g[2010];
  int m;
  int get(int x) {
    if (x > 0)
      return x * 2 - 2;
    else
      return -x * 2 - 1;
  }
  void read() {
    while (m--) {
      int x, y;
      scanf("%d%d", &x, &y);
      x = get(x);
      y = get(y);
      g[x ^ 1].set(y);
      g[y ^ 1].set(x);
    }
    for (int i = 0; i < n * 2; i++) g[i].set(i);
  }
  void calc() {
    for (int i = 0; i < n * 2; i++)
      for (int j = 0; j < n * 2; j++)
        if (g[j][i]) g[j] |= g[i];
  }
  void solve() {
    calc();
    for (int i = 0; i < n * 2; i++) {
      if (g[i][i ^ 1]) {
        for (int j = 0; j < n * 2; j++) {
          g[i].set(j);
          g[j].set(i ^ 1);
        }
      }
    }
    calc();
  }
  void dfs(int v) {
    if (ans[v] != -1) return;
    ans[v] = 1;
    ans[v ^ 1] = 0;
    for (int i = 0; i < n * 2; i++) {
      if (g[v][i]) dfs(i);
    }
  }
  void getans(int u, int v) {
    dfs(u);
    dfs(v ^ 1);
    for (int i = 0; i < n * 2; i++) {
      if ((ans[i] == -1) && !g[i][i ^ 1]) dfs(i);
    }
  }
};
_2sat f, g;
int main() {
  scanf("%d", &n);
  scanf("%d%d", &f.m, &g.m);
  f.read();
  f.calc();
  f.solve();
  g.read();
  g.calc();
  g.solve();
  memset(ans, -1, sizeof(ans));
  for (int i = 0; i < n * 2; i++) {
    for (int j = 0; j < n * 2; j++) {
      if (f.g[i][j] != g.g[i][j]) {
        if (f.g[i][j])
          g.getans(i, j);
        else
          f.getans(i, j);
        for (int k = 0; k < n; k++) printf("%d ", ans[k * 2]);
        puts("");
        return 0;
      }
    }
  }
  puts("SIMILAR");
  return 0;
}
