The problem in ZIMPL format:
set students := {0 .. 15};
set groups := { 1 .. 3};
set pairs := { <s, t> in students * students with s < t };
set relations := {<0,1>,<0,4>,<0,7>,<0,12>,<0,13>,<0,15>,<1,2>,<1,5>,<1,6>,<1,7>,<1,8>,<1,12>,<1,13>,<1,15>,<2,5>,<2,7>,<2,8>,<2,9>,<2,10>,<2,11>,<2,13>,<2,14>,<2,15>,<3,4>,<3,6>,<3,11>,<3,15>,<4,5>,<4,6>,<4,7>,<4,8>,<4,9>,<5,6>,<6,7>,<6,9>,<6,10>,<6,11>,<6,13>,<7,9>,<7,10>,<7,13>,<7,15>,<8,9>,<8,12>,<8,15>,<9,10>,<9,11>,<9,15>,<10,11>,<10,12>,<10,13>,<10,15>,<11,13>,<11,14>,<11,15>,<12,13>,<12,14>,<12,15>,<13,14>,<13,15>};
var in_group[students * groups] binary;
# maximize cost: 0;
subto one_group_each: forall <s> in students: (sum <g> in groups: in_group[s,g]) == 1;
subto group_1_all_related: forall <s,t> in pairs: if not (<s,t> in relations) then in_group[s,1] + in_group[t,1] <= 1 end;
subto group_2_all_related: forall <s,t> in pairs: if <s,t> in relations then in_group[s,2] + in_group[t,2] <= 1 end;
subto group_3_has_five: (sum <s> in students: in_group[s,3]) == 5;
Solution from SCIP:
objective value: 0
in_group#0#2 1 (obj:0)
in_group#1#1 1 (obj:0)
in_group#2#1 1 (obj:0)
in_group#3#2 1 (obj:0)
in_group#4#3 1 (obj:0)
in_group#5#2 1 (obj:0)
in_group#6#3 1 (obj:0)
in_group#7#1 1 (obj:0)
in_group#8#2 1 (obj:0)
in_group#9#3 1 (obj:0)
in_group#10#2 1 (obj:0)
in_group#11#3 1 (obj:0)
in_group#12#3 1 (obj:0)
in_group#13#1 1 (obj:0)
in_group#14#2 1 (obj:0)
in_group#15#1 1 (obj:0)
The solution in words:
Students 1, 2, 7, 13, and 15 are in the first group; students 0, 3, 5, 8, 10, and 14 are in the second group; and students 4, 6, 9, 11, and 12 are in the last group.