#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
template <typename T>
void read(T &t) {
  t = 0;
  char ch = getchar();
  int f = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  do {
    (t *= 10) += ch - '0';
    ch = getchar();
  } while ('0' <= ch && ch <= '9');
  t *= f;
}
const int INF = 0x7f7f7f7f;
const int maxn = (2e5) + 10;
int n, m, tot, head[1010], nxt[maxn];
int from[maxn], to[maxn];
bool vis[1010], ans;
void add(int x) {
  tot++;
  nxt[tot] = head[x];
  head[x] = tot;
}
int S;
void dfs(int u) {
  vis[u] = 1;
  for (int i = head[u], v; i; i = nxt[i]) {
    v = to[i];
    if (S == i || vis[v]) continue;
    dfs(v);
  }
}
int dfn[1010], low[1010];
int sid[1010], cnt, idx;
bool inStack[1010];
stack<int> st;
void tarjan(int u) {
  dfn[u] = low[u] = ++idx;
  inStack[u] = 1;
  st.push(u);
  for (int i = head[u], v; i; i = nxt[i]) {
    v = to[i];
    if (dfn[v] == -1) {
      tarjan(v);
      low[u] = min(low[u], low[v]);
    } else if (inStack[v])
      low[u] = min(low[u], dfn[v]);
  }
  if (dfn[u] == low[u]) {
    cnt++;
    while (1) {
      int v = st.top();
      st.pop();
      inStack[v] = 0;
      sid[v] = cnt;
      if (v == u) break;
    }
  }
}
int main() {
  read(n);
  read(m);
  for (int i = 1; i <= m; i++) {
    read(from[i]);
    read(to[i]);
    add(from[i]);
  }
  memset(dfn, -1, sizeof(dfn));
  for (int i = 1; i <= n; i++) {
    if (dfn[i] == -1) tarjan(i);
  }
  int x, y;
  for (int i = 1; i <= m; i++) {
    x = from[i];
    y = to[i];
    S = i;
    memset(vis, 0, sizeof(vis));
    dfs(x);
    if (sid[x] == sid[y] && vis[y])
      printf("same\n");
    else if (sid[x] != sid[y] && !vis[y])
      printf("same\n");
    else
      printf("diff\n");
  }
  return 0;
}
