#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
template <class T, class U>
inline void Max(T &a, U b) {
  if (a < b) a = b;
}
template <class T, class U>
inline void Min(T &a, U b) {
  if (a > b) a = b;
}
inline void add(int &a, int b) {
  a += b;
  while (a >= 1000000007) a -= 1000000007;
}
int pow(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = ans * (long long)a % 1000000007;
    a = (long long)a * a % 1000000007;
    b >>= 1;
  }
  return ans;
}
vector<pair<int, int> > g[202];
int d[202], q[202], vis[100010], is[100010], now;
vector<pair<int, int> > e;
void dfs(int u) {
  for (__typeof(g[u].begin()) it = g[u].begin(); it != g[u].end(); it++) {
    int j = it->first, k = it->second;
    if (is[k] != now) {
      if (vis[k] != now) e.push_back({u, j});
      is[k] = now;
      dfs(j);
    }
  }
}
int main() {
  int T, i, j, k, m, n, K, ca = 0;
  scanf("%d", &T);
  while (T--) {
    scanf("%d%d", &n, &m);
    now++;
    e.clear();
    for (int i = 0; i < n; i++) g[i].clear(), d[i] = 0;
    for (int k = 0; k < m; k++) {
      scanf("%d%d", &i, &j);
      i--, j--;
      d[i]++, d[j]++;
      g[i].push_back({j, k});
      g[j].push_back({i, k});
    }
    int sz = 0, ans = 0;
    for (int i = 0; i < n; i++) {
      if (d[i] % 2 == 0)
        ans++;
      else
        q[sz++] = i;
    }
    for (int i = 0; i < sz; i++) {
      g[q[i]].push_back({q[i + 1], m + i / 2});
      g[q[i + 1]].push_back({q[i], m + i / 2});
      vis[m + i / 2] = now;
      i++;
    }
    if (sz & 1)
      g[q[sz - 1]].push_back({q[sz - 1], m + sz / 2}), vis[m + sz / 2] = now;
    for (int i = 0; i < n; i++) dfs(i);
    printf("%d\n", ans);
    for (int i = 0; i < (int)(e.size()); i++) {
      printf("%d %d\n", e[i].first + 1, e[i].second + 1);
    }
  }
  return 0;
}
